You are on page 1of 26

BUJDOS GYNGYI

Bevezets az SQL-be
OKTATSI SEGDANYAG AZ
ADATBZISKEZELS CM GYAKORLATHOZ

DEBRECENI EGYETEM INFORMATIKAI KAR

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

A jaratok tbla tartalma

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

A repter tbla szerkezete

A repter tbla tartalma

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

A szamlak tbla szerkezete

A szamlak tbla tartalma

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

Ezen kziknyv minti a fenti adatbzisnak a felhasznlsval mutatjk be a parancsok,


kulcsszavak, kulcskifejezsek mkdst.
Pldul:
1) Tbla ltrehozsa CREATE TABLE

A parancs lersa

SQL> CREATE TABLE szamlak


2 (rkod CHAR(3) PRIMARY KEY,
3 osszeg NUMBER(5) NOT NULL,
4 kelt DATE NOT NULL
5 szla CHAR(20));

Minta a parancs kiadsra, mkdsre.


(Az SQL> prompt s a sorok sorszma nem gpelend be!)

A tbla ltrejtt.

A parancs lefuttatsa utni zenet.

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

AZON, NEV, CIM, EGYENLEG

megadja a mesehsk azonostjt, nevt, cmt s egyenlegt

RENDELES

RENDSZAM, MAZON, DATUM

megadja, hogy az adott rendelsi szm rendelst mikor adta fel az


adott azonostj mesehs

TARTALMAZ

RENDSZAM, CIKKNEV,
MENNYISEG

megadja, hogy az adott rendelsi szmon az adott cikkbl mekkora


mennyisgben rendeltek

CIKK

CIKKNEV, EGYSEGAR

megadja, hogy az adott cikknek mekkora az egysgra

SQL> desc mesehos;


Nv
--------------------------AZON
NEV
CIM
EGYENLEG

Null?
-------NOT NULL
NOT NULL

Tpus
-------CHAR(3)
CHAR(15)
CHAR(20)
NUMBER

SQL> desc cikk


Nv
Null?
------------------ -------CIKKNEV
NOT NULL
EGYSEGAR

SQL> select * from mesehos;

SQL> select * from cikk;

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

SQL> desc tartalmaz


Nv
---------------------------RENDSZAM
CIKKNEV
MENNYISEG

Null?
-------NOT NULL
NOT NULL

Tpus
-------NUMBER
CHAR(12)
NUMBER

SQL> desc rendeles


Nv
Null?
------------------ -------RENDSZAM
NOT NULL
MAZON
DATUM

SQL> select * from tartalmaz;

SQL> select * from rendeles;

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

II. Adatdefincis nyelv


(DDL)

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

Minden Oracle adatbzisban alkalmazhatk azok a tbla- s oszlopnevek, amelyeket az albbi


szablyok figyelembevtelvel adunk meg:

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

DATE Beviteli s kirsi formtuma belltsfgg.


Beviteli forma itt: -HHH-NN
[pl. 99-Okt-2 vagy 2001-Jn-18]
LONGASCII/EBCDIC, max 65 536
1 tblban max. 1 LONG lehet.
Nem hasznlhat:
fggvnyek argumentumban,
kifejezsekben,
a SELECT WHERE, GROUP BY, CONNECT
BY,
ORDER BY, DISTINCT opciival,
RAW ASCII/EBCDIC + grafikk, bitkpek, stb.
NULL Ha egy adott sor adott oszlopba mg nem trtnt
adatbevitel, vagy trltek adatott, akkor ott a NULL
adat szerepel.
II.1.1.1.3.

LONG RAW

NULL vagy NOT NULL

NULL: a mez egy adott sor felvtelnl maradhat res (alaprtelmezs)


NOT NULL: a meznek az adott sor felvtelnl ktelez rtket adni.
7

II.2. Tblk ltrehozsa, mdostsa, trlse


CREATE TABLE, ALTER TABLE, DROP TABLE

1) Tbla ltrehozsa CREATE TABLE


SQL> CREATE TABLE szamlak
2 (rkod CHAR(3) PRIMARY KEY,
3 osszeg NUMBER(5) NOT NULL,
4 kelt DATE NOT NULL
5 szla CHAR(20));
A tbla ltrejtt.
2) Mdosts j oszlop hozzadsa: ALTER TABLE ADD
SQL> ALTER TABLE szamlak
2 ADD rogz CHAR(30);
A tbla mdostva.
Az j oszlopban a mr ltez sorok NULL rtket kapnak, teht gy nem adhat meg a NOT
NULL, ktelez kitltst bellt opci.
3) Mdosts ltez oszlop egyes adatainak mdostsa:
ALTER TABLE MODIFY
SQL> ALTER TABLE szamlak
2 MODIFY rogz CHAR(30) NOT NULL;
A tbla mdostva.
SQL> desc szamlak
Nv
Null?
Tpus
---------------------------------- ------------------- -----------RKOD
NOT NULL CHAR(3)
OSSZEG
NOT NULL NUMBER(5)
KELT
DATE
SZLA
CHAR(10)
ROGZ
NOT NULL CHAR(30)
4) Tbla trlse DROP TABLE
SQL> CREATE TABLE eldobando
2 (egyetlen date);
A tbla ltrejtt.
SQL> DROP TABLE eldobando;
A tbla eldobva.
8

II.3. Nzettblk ltrehozsa s trlse


CREATE VIEW nzettbla_nv [alias_nv1 alias_nv2]
AS szelekcis_utasts;
DROP VIEW nzettbla_nv;
Ha valamilyen tbln/tblkon nagyon gyakran akarunk valamilyen bonyolult, specilis
lekrdezst alkalmazni, akkor rdemes egy olyan nzettblt ltrehozni, amely az illet tbla/tblk szksges feltteleknek eleget tev rszt mutatja.
Sok szempontbl ugyangy viselkednek, mint a tblk.
A nzettblk defincija mindig valamilyen msik nzettbla s/vagy valdi tbla adatainak
szelektv megjelentsre szolgl.
Az AS utni SELECT-re egyetlen kikts: nem tartalmazhat rendezst (ORDER BY).
A nzettbla fizikailag nem troldik. Ha valamilyen mveletet akarunk rajta vgrehajtani, akkor
elbb kirtkeli az t ltrehoz feltteleket, majd az gy kapott adatokon vgrehajtdik a mvelet.
A nzettbla folyamatosan frisstdik.
Ha a nzettbla pontosan egy valdi tbln van meghatrozva s a szelekcis rsze nem tartalmaz
sem GROUP BY sem DISTINCT kulcsszt, bizonyos felttelek mellett az adatokon
vgrehajthat mdosts, illetve trls (lsd ORACLE kziknyv).
a) Ksztsnk most egy olyan nzettblt, amely a Budapestrl indul jratok szmt, indulsi idejt, s cl
vrosnak a nevt jelenti meg!
SQL> CREATE VIEW Budapest AS
2 SELECT szam jarat, indulas, varos hova
3 FROM jaratok, repter
4 WHERE honkod='001' AND hovkod=kod;
A nzet ltrejtt.
b) Trljk a nzettblt!
SQL> DROP VIEW Budapest

III. Adatmanipulcis nyelv


(DML)

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

Elszr a parancsok legegyszerbb hasznlati mdjait tekintjk t:


1) Sor ltrehozsa s teljes feltltse
SQL> INSERT INTO szamlak
2 VALUES ( '001', 10000,
'99-okt-08',
1 sor ltrejtt.

'kovacs',

'99/M182' );

SQL> INSERT INTO szamlak (rkod, osszeg, rogz, szla)


2 VALUES ( '002', 30000,
'NAGY',
1 sor ltrejtt.

'99/R436' );

2) Sor ltrehozsa s rszleges feltltse

3) Mr ltrehozott sor egy vagy tbb adatnak mdostsa


SQL> UPDATE szamlak
2 SET kelt='99-Okt-08', rkod = '003'
3 WHERE szla = '99/R436';
1 sor mdostva.
4) Ltez adat trlse, azaz helyettestse a NULL rtkkel
SQL> UPDATE szamlak
2 SET kelt=NULL
3 WHERE szla = '99/R436';
5) Teljes sor trlse
SQL> DELETE FROM szamlak WHERE rkod='003';
Bonyolultabb formk:
Az INSERT INTO utasts utn a VALUES helyett SELECT is llhat, amellyel valamely
msik tblbl msolhatunk t adatokat.
Pldul a ha ltrehozunk a egy masrepter nev tblt:
SQL> CREATE TABLE masrepter (rep CHAR(3));
oszloppal, amelybe t szeretnnk msolni az sszes reptr kdjt, azt megtehetjk az
SQL> INSERT INTO masrepter SELECT kod FROM repter;
az eredmny 5 j rekord lesz az j tblban:
SQL> SELECT * FROM masrepter;
REP
--001
002
003
004
005
Ezzel a mdszerrel teljes tblatartalmak is ltrehozhatk.

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

Ms nzpontot tekintve azonban a SELECT a DML (Data Manipulation Language) rsze.

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---

SQL> SELECT szam, honkod Bol, hovkod Ba


2 FROM jaratok;
SZAM
--------123
111
112
113
114

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

2) sszehasonlts egy halmaz elemeivel


oszlopnv

halmazsszehasonlt_opertor

halmazdefinci

Beptett halmazokat sszehasonlt opertorok (logiakai tpus vagy prediktum fggvnyek):


BETWEEN rtk AND rtk (lehet numerikus, date, karakter)
IN (lista)
LIKE karakterminta (benne _ %)
3) sszehasonlts a NULL rtkkel
Az IS NULL opertor azt a felttelt adja meg, hogy az az oszlop, amelynek neve az opertor eltt
ll, a NULL rtket tartalmazza. Hasznlata:
oszlopnv

IS NULL

(lsd pl. a d) feladatot).


4) sszetett keressi felttelek
Logikai opertorok:
NOT, AND, OR, IN, NOT IN
Precedencijuk cskken sorrendben:
1.
relcijelek: = , != stb.
2.
NOT
3.
AND
4.
OR
A vgrehajtsi sorrend megvltoztathat a kerek zrjelek hasznlatval.
14

a) Keressk azon reptereket, ahol az illetk 8000 Ft-tl klnbzik:


SQL> SELECT varos, illetek
2 FROM repter
3 WHERE illetek != 8000;
VAROS
------------------------Budapest, Ferihegy 1
Praha
Paris Orly
London Heathrow

ILLETEK
----------5000
5000
10000
12000

b) Szeretnnk tudni, hnyas jratok hov indulnak Budapestrl.


SQL> SELECT szam jarat, honkod bol
2 FROM jaratok
3 WHERE hovkod='001';
JARAT
--------111
113

BOL
----002
003

c) Kilistzzuk a htfi jratokat.


SQL> SELECT szam, honkod bol, hovkod ba
2 FROM jaratok
3 WHERE napok LIKE 'h%';
SZAM BOL BA
--------- ----- ----123 001 002
111 002 001
112 001 003
113 003 001
115 001 003
d) Mely replterekre vonatkozan nem tudjuk a bejelentkezsi idt?
SQL> SELECT varos
2 FROM repter
3 WHERE checkin IS NULL;
VAROS
------------------------London Heathrow
e) Listzzuk ki, hogy a 112, 113, 114, 115-s jratok honnan hov mennek!
SQL> SELECT szam, honkod bol, hovkod ba
2 FROM jaratok
3 WHERE szam BETWEEN '112' AND '115';
15

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

IV.3. Kivlasztott sorok rendezse


SELECT oszlopnv,
FROM tblanv
[WHERE felttel]
ORDER BY oszlopnv [DESC], oszlopnv [DESC],
A felttelnek megfelel sorok rendezse 1 vagy tbb oszlop szerint alaprtelmezsben nvekv, a
DESC opcival kiegsztve cskken sorrendbe.
A rendezs a rendezshez felsorolt oszlopok sorrendje szerint trtnik.
Ha a rendezend oszlopokban NULL rtkek is szerepelnek, a NULL rtket tartalmaz sorok
nem vesznek rszt a rendezsben, hanem a rendezett lista eltt jelennek meg.

a) Rendezzk a pnteki jratokat elsdlegesen a HOVKOD szerint nvekv, msodlagosan a HONKOD


szerint cskken, s mg ezen bell a jrat szma (SZAM) szerint nvekv sorrendbe!
SQL> SELECT szam, hovkod, honkod, indulas
2 FROM jaratok
3 WHERE napok LIKE '%p%'
4 ORDER BY hovkod, honkod DESC, szam;
SZAM HOV HON INDULAS
----------- ------ ------ ----------113 001 003
2032
111 001 002
1023
112 003 001
1535
115 003 001
1415
114 004 003
1322

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

IV.4. Csoportok kpzse


SELECT oszlopkifejezsek
FROM tblanv
[WHERE keressi felttel]
GROUP BY oszlopnv_gb
[HAVING csoportkivlasztsi felttel]

1) Csoportokra alkalmazhat (aggregl/aggregtor) fggvnyek


Fajti:
Szintakszis:

AVG, SUM, MIN, MAX, COUNT


fggvnynv ( [DISTINCT|ALL] kifejezs )
(Az alaprtelmezett az ALL)

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

2. A felttelben szerepl aggregl fggvnyeknek a SELECT oszlopnv-listjban is szerepelnie kell.

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

IV.5. Szrmaztatott adatok fggvnyek s mveletek


A szrmaztatott adatok az adatbzisban lv valdi adatokbl szmthatk ki klnbz beptett
fggvnyek s mveletek felhasznlsval. Az eredmnyek nem troldnak, gy a kifejezsek,
fggvnyek minden egyes hasznlatkor jra kirtkeldnek.
A fggvny egy elre meghatrozott mvelet, amely egy SQL utastsban nevnek s
aktulis paramtereinek megadsval hvhat meg. Minden meghvsakor kirtkeldik, s mindig
rtket ad vissza.
Felhasznlhat
adatokkal vgzett szmtsokra
egyedi adatelemek mdostsra
sorok csoportjn vgzett mveletekre
megjelentend szmok, dtumok, sztringek formzsra
oszlopok adattpusnak konvertlsra.
1) Aritmetikai fggvnyek s mveletek
Megjelenthetk a SELECT-ben, felhasznlhatk annak WHERE s ORDER BY rszben.
Nhny fggvny:
Paramtere:
szm
Eredmnye:
szm
ABS({oszlop | kifejezs}) Az oszlop, a kifejezs vagy a kifejezs ltal meghatrozott oszlop
soraiban lv rtkek abszolt rtkt adja Vissza.
GREATEST(kifejezs, kifejezs,) A legnagyobb rtket adja vissza.
LEAST(kifejezs, kifejezs,) A legkisebbet adja vissza.
POWER(kifejezs, kitev) Hatvnyozs.
ROUND({oszlop|kifejezs}, tizedes jegyek szma) Kerekts a megadott szm tizedesre.
TRUNC({oszlop|kifejezs}, tizedes jegyek szma) A megadott szm tizedes meghagysa.
Mveletek:
Megjegyzs:

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:

karakter vagy karaktersorozat


karakter vagy szm

INITCAP({oszlop | kifejezs})

KOVACS vagy kOVAcs Kovacs

LOWER({oszlop | kifejezs})

KOVACS vagy kOVAcs kovacs

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

SUBSTR(kifejezs, kezd_pozci, hossz) A kezd_pozci-tl kezdden a hossz hosszsg


sztringet adja vissza
RPAD({oszlop | kifejezs}, n, kitlt) az oszlop rtkeit n karakteren balra igaztva jelenti meg
gy, hogy a jobb oldalon fennmarad res helyet a kitlt karakterrel tlti fel.
LPAD({oszlop | kifejezs}, n, kitlt) az oszlop rtkeit n karakteren jobbra igaztva jelenti
meg gy, hogy a bal oldalon fennmarad res helyet a kitlt karakterrel tlti fel.
3) Dtum tpus adatok
A teljes dtum az vszzad, v, hnap, nap, ra, perc, msodperc rszekbl ll.
Megjelentse (gy begpelse is) vltozatos, a rendszer belltsaitl fgg. Az Oracle magyar
nyelv verzijban az alaprtelmezett megjelentsi s beviteli forma:
04-MR-18
ami megfelel az alaprtelmezett YY-MON-DD Magyar nyelv formtumnak
A SYSDATE a rendszerdtumot eredmnyezi.
rtkadsnl pl.:
SQL>UPDATE szamlak
2 SET kelt=sysdate
3 WHERE szla='01/R200';
Lekrdezse:
SQL> SELECT sysdate FROM dual;
Mveletek dtum tpus adatokkal
Dtum + szm
Dtum szm
Dtum dtum

dtum
dtum
napok szma

a szm a hozzadand napok szma


a szm a kivonand napok szma
kt dtum klnbsge napokban

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

TO_DATE(karakter [,'formtummaszk']) konverzis fggvny:


a karakteres tpus adatot dtum tpus adatt konvertlja
rtkadsnl pl.:
SQL>UPDATE szamlak
2 SET kelt= TO_DATE('00/09/11','YY/MM/DD')
3 WHERE szla = '00/M032';
Formtummaszk elemei:
YY
YYYY
YEAR
MM
MON
mon
MONTH
W
WW
D
DD
DDD
DY
DAY
fm

vszm kt karakteren (alaprt.)


teljes vszm
teljes vszm betkkel
a hnap neve kt szmjeggyel
a hnap nevnek els hrom karaktere nagybetkkel (alaprt.)
a hnap nevnek els hrom karaktere kisbetkkel
a hnap teljes nev
a ht sorszma a hnapban
a ht sorszma az vben
a nap sorszma a hten
a nap sorszma a hnapban
a nap sorszma az vben
a ht napjnak hrombets rvidtse
a ht napjnak teljes neve
leszedi az egybknt megjelentend nullkat s kitlt szkzket a
szmok ell

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

b) Mennyi a bejelentkezsi idk vals tlaga?


SQL> SELECT AVG(checkin)
2 FROM repter;

SQL> SELECT AVG(NVL(checkin,0))


2 FROM repter;

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

d) A fenti plda sszegzssel egytt:


SQL> SELECT varos repuloter, SUM(osszeg) osszesen
2 FROM repter, szamlak
3 WHERE kod = rkod AND osszeg > 10000
4 GROUP BY varos;
REPULOTER
OSSZESEN
-------------------------------------Budapest, Ferihegy 1
11328
Paris Orly
12000
Praha
71560
Warszawa Internacionalna
72000
e) Melyik reptrrl nem rkezett mg szmla?
SQL> SELECT UNIQUE varos
2 FROM repter, szamlak
3 WHERE kod NOT IN (SELECT rkod FROM szamlak);

25

IV.7. Egymsba gyazott lekrdezsek


A SELECT utasts WHERE rszbe jabb SELECT utastsok gyazhatk.
Az egymsba gyazott lekrdezseket az alaprendszer bellrl kifel haladva dolgozza fel.
Ha egynl tbb oszlopot kvnunk tvenni a bels SELECT-bl, akkor a kls SELECT
WHERE rszben az tvenni kvnt oszlopokat ( ) zrjelek kz kell zrni.
A bels SELECT-bl is hivatkozhatunk a kls SELECT-re, ezeket az egymsba skatulyzott
SELECT-eknek nevezzk.
A bels SELECT ltal visszaadott listt kezelhetjk az ANY, ALL, illetve EXISTS eszkzkkel.
a) Listzzuk ki a 12:00 utn indul jratok szmt s indulsi idejt!
SQL> SELECT szam, indulas
2 FROM jaratok
3 WHERE szam IN
4 (SELECT szam
5
FROM jaratok
6 WHERE indulas>1200);
SZAM
-----------112
113
114
115

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

You might also like