kategória | ||||||||||
|
||||||||||
|
||
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_ 616d37g 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);
Találat: 1330