Szűrési feltétel
SELECT *
FROM Beteg, Kezeles
WHERE Beteg.ID = Kezeles.BetegID AND Kezeles.Datum = CURRENT DATE
Egyes sorokat csoportosítva irat ki
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
Csoprtositás utáni eredményhalmaz
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
HAVING COUNT(*) > 1
Rendezés
SELECT *
FROM Beteg
ORDER BY Szuletes DESC
Logikai szürés
CASE WHEN logikai vizsgálat THEN kifejezés ha igaz .. ELSE kifejezés ha az előzőekre nem illeszkedik END
Adat hozzáadása a táblához
INSERT INTO Szamla (Szamlaszam, Tulajdonos, Nyitas, Allapot)
VALUES (123456, 'H. Kovács Géza', '1996.05.14.', 'N');
Módosítás
UPDATE Szamla SET Allapot = 'D' WHERE Szamlaszam = 123456;
Törlés a táblából
DELETE FROM Beteg WHERE TAJ = '123 456 789';
grant select on egy_tabla to user1;
Ezzel a user1 felhasználó tud select-tet végrehajtani az egy_tabla-n.
grant create table to user1;
Ezzel a user1 felhasználó tud táblát létrehozni.
REVOKE
Ezzel tudunk meglévő jogosultságot visszavonni.
revoke create table from user1;
revoke select on egy_tabla from user1;
Az összekapcsolás lényege, hogy két vagy több táblában tárolt adatokat tudunk lekérdezni az alapján, hogy hol egyezik a megadott mezőérték.
SELECT * FROM gepjarmu;
car_azonosito rendszam
--------------- ----------
1001 ZQL-556
1002 WPT-444
1003 ZRM-555
SELECT * FROM javitasok;
car_ID alkatresz
------------- ------------
1001 váltó
1001 kerék
1002 kerék
1004 futómű
Általában a két táblában lévő azonosító oszlop elnevezése megegyezik (pl. car_azonosito lenne a javitasok táblában is), de ez nem szükséges, ezért szerepel kétfajta elnevezés a két táblában.
A feltétel nélküli összekapcsolás. Ez az összekapcsolás a két tábla minden sorát összekapcsolja. Az inner join ennek részhalmaza (az a where feltétel, amikor egyezik a két táblában az azonositó)
select * from gepjarmu
cross join javitasok
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1001 ZQL-556 1002 kerék
1001 ZQL-556 1002 váltó
1001 ZQL-556 1004 futómű
1002 WPD-444 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1002 WPD-444 1004 futómű
1003 ZRM-555 1001 váltó
1003 ZRM-555 1002 kerék
1003 ZRM-555 1002 váltó
1003 ZRM-555 1004 futómű
Amennyiben feltétel nélkül select-tet adunk meg két táblával, akkor a cross join-nak megfelelő eredményt kapjuk:
select * from gepjarmu, javitasok
A cartesian join sorainak száma a két tábla sorainak számának szorzata. A példában: 3 • 4 = 12
INNER JOIN
Belső összekapcsolás, metszet
A két tábla metszete, azaz azok a sorok, amelyek mindkét táblában megtalálhatóak.
select * from gepjarmu, javitasok
where gepjarmu.car_azonosito = javitasok.car_ID
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
Ebben a select-ben csak azok a sorok jelennek meg, amelyek mindkét táblában megtalálhatóak (1001 és 1002 azonosítójú autók) és annyiszor ahány sorban megjelenik az azonosító (az 1002-es azonosítójú gépjármű kétszer, mert a javitasok táblában kétszer szerepel.) A where feltételben megadott inner join jól mutatja, hogy az inner join a cartesian join (minden-mindennel) azon részhalmaza, ahol egyezik az azonosító. Az inner join másfajta felírása (eredménye ugyanaz mint a where feltételben megadott összekapcsolás)
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
Az „inner” szó elhagyható, az önállóan feltüntetett „join” is ugyanúgy az inner join-t adja.
LEFT JOIN
Baloldali kapcsolás. A kapcsolás alapját (értelmezési tartományát, gepjarmu tábla) adó tábla összes sorához történik hozzárendelés.
select * from gepjarmu
left join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1003 ZRM-555 (null) (null)
- ha szerepel a másik táblában érték akkor azt rendeli hozzá (pl. 1001-es gépjárműhöz ’váltó’)
- ha többször szerepel a másik táblában érték, akkor annyiszor kerül feltüntetésre, ahány sorban megtalálható a másik táblában (pl. az 1002-es gépjármű kétszer szerepel, mert két sorban is megjelenik a javitasok táblában: ’kerék’ és ’váltó’)
- ha nem található meg a második táblában akkor NULL érték kerül hozzárendelésre (pl az 1003-as gépjármű nincs benne a javitasok táblában)
Használatos a left join helyett a left outer join parancs, amely tartalmilag megegyezik.
RIGHT JOIN
Jobboldali kapcsolás. A kapcsolt (második, javitasok tábla) minden eleméhez elvégzi a hozzákapcsolást.
select * from gepjarmu
right join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
(null) (null) 1004 futómű
- ha szerepel az első táblában érték, akkor azt rendeli hozzá (pl. 1001-es car_ID gépjárműhöz található rendszám)
FULL JOIN
Mindkét oldalról elvégzi az összekapcsolást, azaz az előző három join uniója:
- inner join
- right join
- left join
select * from gepjarmu
full join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1003 ZRM-555 (null) (null)
(null) (null) 1004 futómű
Tehát a left join, right join és inner join megfogalmazható úgy is, hogy ezek a full join részhalmazai. Az inner join a full join olyan részhalmaza, amely sorban nem szerepelnek (null) értékek. Mivel a full join a három join uniója, ezért helyettesíthető az alábbi paranccsal:
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
union
select * from gepjarmu
left join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
union
select * from gepjarmu
right join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
A full join szerepel az Oracle, ProstgreSQL és MS SQL Server verziókban, de nem szerepel a MySQL, SQLite típusokban – ez utóbbi esetekben az előző union paranccsal tudjuk létrehozni.
A full join és cartesian join kapcsolata: két tábla cartesian join (minden adat mindegyikkel kapcsolva) és full join halmazainak metszete a két tábla inner join-ja.
Használatos a full join helyett a full outer join parancs, amely tartalmilag megegyezik.
SELF JOIN és tábla alias
Érdemes használni a tábla nevekre a lekérdezésekben aliast, mert megkönnyíti a hivatkozást:
select * from gepjarmu a, javitasok b
where a.car_azonosito = b.car_ID
Szükséges lehet önmagával kapcsolni a táblát (self-join). Ebben az esetben a két táblát alias-szal tudjuk megkülönböztetni. A következő példában szeretnénk kigyűjteni a dolgozo táblából minden dolgozóhoz a nálánál kevesebbet keresőket.
select * from dolgozo
name sal
---------- ----------
Nagy 7500
Balogh 7600
Kovács 7700
Szabó 7800
select * from dolgozo x, dolgozo y
where x.sal < y.sal
name sal name sal
---------- ---------- ---------- ----------
Nagy 7500 Balogh 7600
Nagy 7500 Kovács 7700
Balogh 7600 Kovács 7700
Nagy 7500 Szabó 7800
Balogh 7600 Szabó 7800
Kovács 7700 Szabó 7800
Változók, elágazások, ciklusok
Az SQL-t az idők során kiegészítették olyan tulajdonságokkal, hogy a programozók képesek legyenek benne bonyolult algoritmusokat is írni. Ez akkor válhat szükségessé, ha például komoly adatkezelési feladatokat szeretnénk az ügyféloldalról a kiszolgálóoldalra áthelyezni, az ott elérhető sokkal nagyobb teljesítmény miatt. De az is lehet, hogy csak egyszerűsíteni akarjuk a programozást felhasználói függvények létrehozásával (például szükségünk lenne egy olyan függvényre, ami a tajszámból kiszedi a szóközöket).
Az SQL nyelv részei a változókezelés, elágazások, ciklusok kezelése, kivételkezelés stb.
A legnagyobb különbségek az SQL kiszolgálók között éppen ezeknél a nyelvi elemeknél adódik: ahány gyártó, annyiféle megvalósítás.
Az egyéb nyelvi elemek szemléltetésére álljon itt egy Sybase ASA SQL példa:
CREATE FUNCTION DigitsOnly(IN M_Nev VARCHAR(30))
RETURNS VARCHAR(30)
BEGIN
DECLARE M_Result VARCHAR(16);
DECLARE i INTEGER;
SET i = 1;
SET M_Result = '';
WHILE (i <= LENGTH(M_Nev)) LOOP
IF SUBSTR(M_Nev, i, 1) BETWEEN '0' AND '9' THEN
SET M_Result = M_Result + SUBSTR(M_Nev, i, 1)
END IF;
SET i = i + 1;
END LOOP;
IF m_Result = '' THEN
RETURN(Null)
ELSE
RETURN(M_Result)
END IF;
END;
A fenti függvény a bemenetére küldött szövegből csak a számjegyeket hagyja meg.
Létrehoz egy adatbázis táblát, 4 oszloppal.
CREATE TABLE Szamla (
Szamlaszam NUMERIC(24),
Tulajdonos VARCHAR(60),
Nyitas DATE,
Allapot VARCHAR(1),
PRIMARY KEY (Szamlaszam)
);
Példa mMódosításra
ALTER TABLE Szamla
ALTER COLUMN Szamlaszam VARCHAR(26);
Megszüntetés index és adattábla
DROP INDEX Szamla_1;
DROP TABLE egy_tabla;
Tartalom törlése a táblából
TRUNCATE TABLE egy_tabla;
Lekérdezés formája
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
HAVING COUNT(*) > 1
ORDER BY Tulajdonos
A vevő neve mellett megjeleníti az eddigi rendeléseinek összegét is.
SELECT Vevo.Nev, (SELECT SUM(Osszeg) FROM Rendeles WHERE VevoID = Vevo.ID) RendelesOsszeg
A lekérdezés megkeresi a legnagyobb árbevételű munkáinkat – akkor használható jól, ha több is van belőle.
SELECT munka_szám FROM munka
WHERE óraszám*óradíj = (
SELECT max(óraszám*óradíj) FROM munka
SELECT *
FROM Beteg, Kezeles
WHERE Kezeles.Beteg_ID = Beteg.Beteg_ID
SELECT *
FROM Beteg
INNER JOIN Kezeles ON Kezeles.Beteg_ID = Beteg.Beteg_ID );
/* teljes tablazat lekerdezese */
SELECT * FROM ALKALMAZOTT;
/* projekcio, csak a kivalasztott oszlopok */
SELECT OSZT_AZON, NEV, FONOK FROM ALKALMAZOTT;
/* kifejezesek az oszlopokban */
/* eves fizetes */
SELECT NEV, FIZETES * 12 "EVES FIZETES" FROM ALKALMAZOTT;
/* szoveges oszlopok osszevonasa */
SELECT ALK_AZON||'-'||NEV DOLGOZO, 'OSZTALY', OSZT_AZON FROM ALKALMAZOTT;
/* NULL ertekek a kifejezesben */
SELECT NEV, FIZETES * 12 + JUTALOM "EVES JOVEDELEM" FROM ALKALMAZOTT;
SELECT NEV, FIZETES * 12 + NVL(JUTALOM, 0) "EVES JOVEDELEM" FROM ALKALMAZOTT;
/* duplikalt sorok elhagyása */
SELECT OSZT_AZON FROM ALKALMAZOTT;
SELECT DISTINCT OSZT_AZON FROM ALKALMAZOTT;
SELECT DISTINCT OSZT_AZON, BEOSZTAS FROM ALKALMAZOTT;
/* eredmeny sorok rendezese */
SELECT NEV, BEOSZTAS, FIZETES * 12, OSZT_AZON FROM ALKALMAZOTT
ORDER BY NEV;
/* csokkeno sorrend */
SELECT NEV, BEOSZTAS, BELEPES FROM ALKALMAZOTT
ORDER BY BELEPES DESC;
/* tob rendezesi szempont */
SELECT OSZT_AZON, BEOSZTAS, NEV FROM ALKALMAZOTT
ORDER BY OSZT_AZON, FIZETES DESC;
/* a rendezesi szempont az oszlop sorszamaval */
SELECT NEV, FIZETES FROM ALKALMAZOTT
ORDER BY 2;
/* válogatás a sorok kozul */
select * from alkalmazott where nev = 'SKOT';
select * from alkalmazott where fizetés < 1200';
select * from alkalmazott where belepes > '04-JUN-87';
select * from alkalmazott where jutalom >= 500;
select * from alkalmazott where fizetes between 1000 and 2000;
select * from alkalmazott where fonok in (7902, 7566, 7788);
select * from alkalmazott where nev like 'S%';
select * from alkalmazott where nev like '____';
select * from alkalmazott where fonok is null;
select * from alkalmazott where fonok is not null;
/* osszetett feltetelek */
select alk_azon, nev, beosztas, fizetes from alkalmazott
where sal between 1000 and 2000 and beosztas = 'ELOADO';
select alk_azon, nev, beosztas, fizetes from alkalmazott
where sal between 1000 and 2000 or beosztas = 'ELOADO';
/* osztalyok kodjai es nevei rendezve */
select oszt_azon, nev from osztaly order by oszt_azon;
/* kulonbozo beosztasok */
select distinct beosztas from alkalmazott;
/* 10-es és a 20-as osztalyon dolgozok nev szerint rendezve */
select * from alkalmazott
where oszt_azon in (10,20)
order by nev;
/* 20-as osztalyon dolgozo eloadok neve es beosztasa */
select nev, beosztas from alkalmazott where oszt_azon = 20;
/* "ES"-t vagy "IR"-t tartalmazo nevek */
select nev from alkalmazott
where nev like '%ES%' or nev like '%IR%';
/* nev, beosztas, fizetes azokra akiknek van fonokuk */
select nev, beosztas, fizetes from alkalmazott
where fonok is not null;
/* az 1981-ben belepett alkalmazottak */
select nev, oszt_azon, belepes from alkalmazott
where belepes like '%81';
select nev, oszt_azon, belepes from alkalmazott
where belepes between '01-JAN-81' and '31-DEC-81';
/* osszevont oszlopok */
select nev||' '||beosztas||' beosztasban dolgozik '||belepes||' ota'
"ki, mit csinal, mi ota" from alkalmazott;
/* valtozokat tartalmazo kifejezesek */
select nev, belepes from alkalmazott
where belepes between '&kezdo' and '&veg';
select nev, beosztas, fizetes, fonok, oszt_azon from alkalmazott
where beosztas = '&beosztas';
/* sqlplus valtozo hasznalata */
define eves = 'fizetes*12+nvl(jutalom,0)'
select nev, &eves from alkalmazott where &eves > 30000;
/* karakteres fuggvenyek */
/* nagybetusse alakitas */
select nev, beosztas from alkalmazott
where beosztas = upper ('&beosztas');
/* kisbetusse alakitas */
select lower(beosztas) from alkalmazott;
/* szavak kezdo betui nagy betuve */
select initcap(nev) from alkalmazott;
/* feltoltes jobbrol vagy balrol */
select rpad(nev, 10, '_') nev, lpad(beosztas, 10) beosztas,
lpad (oszt_azon, 7, '.') reszleg from alkalmazott;
/* karakterek eltavolitasa jobb vagy bal szelrol */
select rtrim(beosztas, 'KR'), ltrim(nev, 'SM') from alkalmazott;
/* sztring pozicioja az oszlopban */
select nev, instr(nev, 'A') from alkalmazott;
/* sztring hossza */
select nev, length(nev) from alkalmazott;
/* karakterek csereje, ekezetek nelkuli kiiratas */
select translate(nev, 'ÁÉÓÖÔÚÜŰ', 'AEOOOUUU') from alkalmazott;
/* fuggvenyek egymasba agyazasa, E betuk szama a nevekben */
select nev, length(nev)-length(replace(nev, 'E')) E from alkalmazott;
/* numerikus fuggvények */
/* kerekites */
define x=fizetes/30
select &x, round(&x), round(&x,2), round(&x,-1) from alkalmazott
where oszt_azon = 10;
/* csonkitas */
select &x, trunc(&x), trunc(&x,2), trunc(&x,-1) from alkalmazott
where oszt_azon = 10;
/* fizetes 15%-al novelt erteke */
select nev, round(fizetes*1.15) "novelt fizetes" from alkalmazott;
/* datum fuggvenyek */
/* aktualis datum lekerdezese */
select sysdate from sys.dual;
/* aritmetikai muveletek datumokkal */
select belepes, belepes+7, sysdate-belepes from alkalmazott
where oszt_azon = 10;
/* kulonbseg honapokban, a 160 honapnal regebben belepett alkalmazottak */
select nev, belepes, months_between(sysdate, belepes)
from alkalmazott
where months_between(sysdate, belepes) > 160;
/* honapok hozzaadasa, levonasa */
select add_months(sysdate, 2) from sys.dual;
select add_months(sysdate, -5) from sys.dual;
/* kovetkezo nap */
select next_day(sysdate, 'SUNDAY') from sys.dual;
/* honap utolso napja */
select last_day(sysdate) from sys.dual;
/* datum kerekites */
select sysdate, round(sysdate, 'month'), round(sysdate, 'year') from sys.dual;
/* datum csonkitas */
select sysdate, trunc(sysdate, 'month'), trunc(sysdate, 'year') from sys.dual;
/* konverzios fuggvenyek */
/* szam sztringge alakitas */
select nev, to_char(fizetes, '$9,999') from alkalmazott
where beosztas = 'MANAGER';
/* datum sztringge alakitas */
select to_char(sysdate, 'yyyy month dd day') from sys.dual;
/* ido es datum */
select to_char(sysdate, 'yyyy.mm.dd HH:MI:SS') from sys.dual;
/* mahoz 2 evre milyen nap lesz */
select to_char(add_months(sysdate, 24), 'DAY') from sys.dual;
/* sztring datumma alakitas */
select to_date('96.11.20', 'YY.MM.DD') from sys.dual;
/* csoport fuggvenyek */
/* teljes tablara */
select min(fizetes), max(fizetes), sum(fizetes), avg(fizetes), count(fizetes)
from alkalmazott;
/* csoportokra */
select oszt_azon, min(fizetes), max(fizetes), sum(fizetes), avg(fizetes), count(fizetes)
from alkalmazott
group by oszt_azon;
/* valogatas a csoportok kozul */
select oszt_azon, avg(fizetes) from alkalmazott
group by oszt_azon having count(*) > 3;
/* valogatas a sorok es csoportok kozul is */
select oszt_azon, avg(fizetes) from alkalmazott
where beosztas != 'ELOADO'
group by oszt_azon having min(fizetes) > 1000;
/* beosztasonkent a legkisebb fizetes */
select beosztas, min(fizetes) MIN, max(fizetes) MAX from alkalmazott
group by beosztas;
/* managerek szama */
select count(*) from alkalmazott where beosztas = 'MANAGER';
/* lekerdezes tobb tablabol */
/* egyen osszekapcsolas */
select alkalmazott.nev, beosztas, osztaly.nev from alkalmazott, osztaly
where alkalmazott.oszt_azon = osztaly.oszt_azon;
/* Descartes szorzat, osszekapcsolas minden kombinacioban */
select osztaly.nev, alkalmazott.nev from osztaly, alkalmazott;
/* nem egyen osszekapcsolas */
select a.nev, a.fizetes, f.f_oszt from alkalmazott a, fiz_oszt f
where a.fizetes between f.min and f.max;
/* Budapesten dolgozok nevsora */
select a.nev from alkalmazott a, osztaly o
where a.oszt_azon = o.oszt_azon and o.varos = 'BUDAPEST';
/* kulso osszekapcsolas */
select o.oszt_azon, o.nev, a.nev from alkalmazott a, osztaly o
where a.oszt_azon (+) = o.oszt_azon;
/* tabla osszekapcsolasa onmagaval */
/* fonok beosztott parok */
select a.nev fonok, b.nev beosztott from alkalmazott a, alkalmazott b
where b.fonok = a. alk_azon;
select a.nev fonok, b.nev beosztott from alkalmazott a, alkalmazott b
where b.fonok = a. alk_azon (+);
/* alkalmazottak akik a fonokuk elott leptek be */
select a.nev BEOSZTOTT, a.belepes, b.nev FÔNÖK, b.belepes
from alkalmazott a, alkalmazott b
where a.fonok = b.alk_azon and a.belepes < b.belepes;
/* halmaz muveletek */
/* unio osztalyok, ahol manager vagy ugynok dolgozik */
select distinct oszt_azon from alkalmazott
where beosztas = 'MANAGER'
union
select distinct oszt_azon from alkalmazott
where beosztas = 'UGYNOK';
/* metszet, azok az osztalyok amelyeknek van dolgozoja */
select distinct oszt_azon from alkalmazott
intersect
select oszt_azon from osztaly;
/* kulonbseg, azok az osztalyok, ahol nem dolgozik senki */
select oszt_azon from osztaly
minus
select oszt_azon from alkalmazott;
/* egymasba agyazott lekerdezesek */
/* legkisebb fizetesu dolgozo */
select nev, fizetes from alkalmazott
where fizetes = (select min(fizetes) from alkalmazott);
/* szaboval azonos munkakorben dolgozok */
select nev, beosztas from alkalmazott
where beosztas = (select beosztas from alkalmazott
where nev = 'SZABO');
/* legkisebb fizetesu dolgozo osztalyonkent */
select nev, fizetes, oszt_azon from alkalmazott
where (fizetes, oszt_azon) in
(select min(fizetes), oszt_azon from alkalmazott
group by oszt_azon);
/* 30-as minimum fizetesenel tobbet keresok */
select nev, beosztas, fizetes from alkalmazott
where fizetes > any
(select fizetes from alkalmazott
where oszt_azon = 30);
/* a 30-as osztalyon legtobbet keresonel magasabb fizetesuek */
select fizetes, beosztas, nev from alkalmazott
where fizetes > all
(select fizetes from alkalmazott where oszt_azon = 30);
/* legmagasabb atlagfizetesu beosztas */
select beosztas, avg(fizetes) from alkalmazott
group by beosztas
having avg(fizetes) =
(select max(avg(fizetes)) from alkalmazott
group by beosztas);
/* korrelacio */
/* akiknek nagyobb a fizetesuk, mint az osztaly atlag */
select oszt_azon, nev, fizetes from alkalmazott a
where fizetes > (select avg(fizetes) from alkalmazott
where oszt_azon = a.oszt_azon)
order by oszt_azon;
/* akiknek legalabb egy beosztottja van */
select nev, beosztas, oszt_azon from alkalmazott a
where exists (select * from alkalmazott
where fonok = a.alk_azon);
/* osztolyonkent az utolsonak belepett dolgozo */
select oszt_azon, nev, belepes from alkalmazott
where (oszt_azon, belepes) in (select oszt_azon, max(belepes)
from alkalmazott group by oszt_azon)
order by belepes dec;
/* osztaly amelyiknek nincs dolgozoja */
select nev from osztaly o
where not exists (select * from alkalmazott
where oszt_azon = o.oszt_azon);
/* az az osztaly, ahol legmagasabb az eves atlagjovedelem */
define x=fizetes * 12+nvl(jutalek,0)
select oszt_azon, avg(&x) from alkalmazott
group by oszt_azon
having avg(&x) = (select max(avg(&x)) from alkalmazott
group by oszt_azon);
===========================================================
/* Demo tablak feltoltese */
/* set termout off */
DROP TABLE ALKALMAZOTT;
DROP TABLE OSZTALY;
DROP TABLE FIZ_OSZT;
DROP TABLE DUMMY;
DROP SEQUENCE AZON;
DROP VIEW OSZT_ATLAG;
DROP VIEW BEOSZT_ATLAG;
CREATE TABLE OSZTALY (
OSZT_AZON NUMBER(2) NOT NULL,
NEV VARCHAR(14),
VAROS VARCHAR(13));
INSERT INTO OSZTALY VALUES (10,'SZAMLAZAS','BUDAPEST');
INSERT INTO OSZTALY VALUES (20,'KUTATAS','ESZTERGOM');
INSERT INTO OSZTALY VALUES (30,'RAKTAR','BUDAORS');
INSERT INTO OSZTALY VALUES (40,'FORGALMAZAS','BUDAPEST');
CREATE TABLE ALKALMAZOTT (
ALK_AZON NUMBER(4) NOT NULL,
NEV VARCHAR(10),
BEOSZTAS VARCHAR(9),
FONOK NUMBER(4),
BELEPES DATE,
FIZETES NUMBER(7,2),
JUTALOM NUMBER(7,2),
OSZT_AZON NUMBER(2) NOT NULL);
INSERT INTO ALKALMAZOTT VALUES (7839,'KIRALY','ELNOK',NULL,'17-NOV-81',5000,NULL,10);
INSERT INTO ALKALMAZOTT VALUES (7698,'BIRO','MANAGER',7839,'1-MAY-81',2850,NULL,30);
INSERT INTO ALKALMAZOTT VALUES (7782,'CSALO','MANAGER',7839,'9-JUN-81',2450,NULL,10);
INSERT INTO ALKALMAZOTT VALUES (7566,'JONAS','MANAGER',7839,'2-APR-81',2975,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7654,'MARTON','UGYNOK',7698,'28-SEP-81',1250,1400,30);
INSERT INTO ALKALMAZOTT VALUES (7499,'ALI','UGYNOK',7698,'20-FEB-81',1600,300,30);
INSERT INTO ALKALMAZOTT VALUES (7844,'TURCSI','UGYNOK',7698,'8-SEP-81',1500,0,30);
INSERT INTO ALKALMAZOTT VALUES (7900,'JENES','ELOADO',7698,'3-DEC-81',950,NULL,30);
INSERT INTO ALKALMAZOTT VALUES (7521,'VAMOS','UGYNOK',7698,'22-FEB-81',1250,500,30);
INSERT INTO ALKALMAZOTT VALUES (7902,'FINESZ','ELEMZO',7566,'3-DEC-81',3000,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7369,'SZABO','ELOADO',7902,'17-DEC-80',800,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7788,'SKOT','ELEMZO',7566,'09-DEC-82',3000,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7876,'ADAM','ELOADO',7788,'12-JAN-83',1100,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7934,'MULLER','ELOADO',7782,'23-JAN-82',1300,NULL,10);
CREATE TABLE FIZ_OSZT (
F_OSZT NUMBER,
MIN NUMBER,
MAX NUMBER);
INSERT INTO FIZ_OSZT VALUES (1,700,1200);
INSERT INTO FIZ_OSZT VALUES (2,1201,1400);
INSERT INTO FIZ_OSZT VALUES (3,1401,2000);
INSERT INTO FIZ_OSZT VALUES (4,2001,3000);
INSERT INTO FIZ_OSZT VALUES (5,3001,9999);
CREATE TABLE DUMMY (
DUMMY NUMBER );
INSERT INTO DUMMY VALUES (0);
CREATE SEQUENCE AZON
INCREMENT BY 1
START WITH 7935
NOCACHE;
CREATE VIEW OSZT_ATLAG AS
SELECT OSZTALY.NEV, AVG(FIZETES) ATLAG FROM OSZTALY, ALKALMAZOTT
WHERE OSZTALY.OSZT_AZON = ALKALMAZOTT.OSZT_AZON
GROUP BY OSZTALY.NEV;
CREATE VIEW BEOSZT_ATLAG AS
SELECT BEOSZTAS, AVG(FIZETES) ATLAG FROM ALKALMAZOTT
GROUP BY BEOSZTAS;
COMMIT;
http://aries.ektf.hu/~holovacs/AB/5_SQL_2.htm
SELECT *
FROM Beteg, Kezeles
WHERE Beteg.ID = Kezeles.BetegID AND Kezeles.Datum = CURRENT DATE
Egyes sorokat csoportosítva irat ki
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
Csoprtositás utáni eredményhalmaz
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
HAVING COUNT(*) > 1
Rendezés
SELECT *
FROM Beteg
ORDER BY Szuletes DESC
Logikai szürés
CASE WHEN logikai vizsgálat THEN kifejezés ha igaz .. ELSE kifejezés ha az előzőekre nem illeszkedik END
Adat hozzáadása a táblához
INSERT INTO Szamla (Szamlaszam, Tulajdonos, Nyitas, Allapot)
VALUES (123456, 'H. Kovács Géza', '1996.05.14.', 'N');
Módosítás
UPDATE Szamla SET Allapot = 'D' WHERE Szamlaszam = 123456;
Törlés a táblából
DELETE FROM Beteg WHERE TAJ = '123 456 789';
grant select on egy_tabla to user1;
Ezzel a user1 felhasználó tud select-tet végrehajtani az egy_tabla-n.
grant create table to user1;
Ezzel a user1 felhasználó tud táblát létrehozni.
REVOKE
Ezzel tudunk meglévő jogosultságot visszavonni.
revoke create table from user1;
revoke select on egy_tabla from user1;
Az összekapcsolás lényege, hogy két vagy több táblában tárolt adatokat tudunk lekérdezni az alapján, hogy hol egyezik a megadott mezőérték.
SELECT * FROM gepjarmu;
car_azonosito rendszam
--------------- ----------
1001 ZQL-556
1002 WPT-444
1003 ZRM-555
SELECT * FROM javitasok;
car_ID alkatresz
------------- ------------
1001 váltó
1001 kerék
1002 kerék
1004 futómű
Általában a két táblában lévő azonosító oszlop elnevezése megegyezik (pl. car_azonosito lenne a javitasok táblában is), de ez nem szükséges, ezért szerepel kétfajta elnevezés a két táblában.
A feltétel nélküli összekapcsolás. Ez az összekapcsolás a két tábla minden sorát összekapcsolja. Az inner join ennek részhalmaza (az a where feltétel, amikor egyezik a két táblában az azonositó)
select * from gepjarmu
cross join javitasok
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1001 ZQL-556 1002 kerék
1001 ZQL-556 1002 váltó
1001 ZQL-556 1004 futómű
1002 WPD-444 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1002 WPD-444 1004 futómű
1003 ZRM-555 1001 váltó
1003 ZRM-555 1002 kerék
1003 ZRM-555 1002 váltó
1003 ZRM-555 1004 futómű
Amennyiben feltétel nélkül select-tet adunk meg két táblával, akkor a cross join-nak megfelelő eredményt kapjuk:
select * from gepjarmu, javitasok
A cartesian join sorainak száma a két tábla sorainak számának szorzata. A példában: 3 • 4 = 12
INNER JOIN
Belső összekapcsolás, metszet
A két tábla metszete, azaz azok a sorok, amelyek mindkét táblában megtalálhatóak.
select * from gepjarmu, javitasok
where gepjarmu.car_azonosito = javitasok.car_ID
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
Ebben a select-ben csak azok a sorok jelennek meg, amelyek mindkét táblában megtalálhatóak (1001 és 1002 azonosítójú autók) és annyiszor ahány sorban megjelenik az azonosító (az 1002-es azonosítójú gépjármű kétszer, mert a javitasok táblában kétszer szerepel.) A where feltételben megadott inner join jól mutatja, hogy az inner join a cartesian join (minden-mindennel) azon részhalmaza, ahol egyezik az azonosító. Az inner join másfajta felírása (eredménye ugyanaz mint a where feltételben megadott összekapcsolás)
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
Az „inner” szó elhagyható, az önállóan feltüntetett „join” is ugyanúgy az inner join-t adja.
LEFT JOIN
Baloldali kapcsolás. A kapcsolás alapját (értelmezési tartományát, gepjarmu tábla) adó tábla összes sorához történik hozzárendelés.
select * from gepjarmu
left join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1003 ZRM-555 (null) (null)
- ha szerepel a másik táblában érték akkor azt rendeli hozzá (pl. 1001-es gépjárműhöz ’váltó’)
- ha többször szerepel a másik táblában érték, akkor annyiszor kerül feltüntetésre, ahány sorban megtalálható a másik táblában (pl. az 1002-es gépjármű kétszer szerepel, mert két sorban is megjelenik a javitasok táblában: ’kerék’ és ’váltó’)
- ha nem található meg a második táblában akkor NULL érték kerül hozzárendelésre (pl az 1003-as gépjármű nincs benne a javitasok táblában)
Használatos a left join helyett a left outer join parancs, amely tartalmilag megegyezik.
RIGHT JOIN
Jobboldali kapcsolás. A kapcsolt (második, javitasok tábla) minden eleméhez elvégzi a hozzákapcsolást.
select * from gepjarmu
right join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
(null) (null) 1004 futómű
- ha szerepel az első táblában érték, akkor azt rendeli hozzá (pl. 1001-es car_ID gépjárműhöz található rendszám)
FULL JOIN
Mindkét oldalról elvégzi az összekapcsolást, azaz az előző három join uniója:
- inner join
- right join
- left join
select * from gepjarmu
full join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1003 ZRM-555 (null) (null)
(null) (null) 1004 futómű
Tehát a left join, right join és inner join megfogalmazható úgy is, hogy ezek a full join részhalmazai. Az inner join a full join olyan részhalmaza, amely sorban nem szerepelnek (null) értékek. Mivel a full join a három join uniója, ezért helyettesíthető az alábbi paranccsal:
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
union
select * from gepjarmu
left join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
union
select * from gepjarmu
right join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
A full join szerepel az Oracle, ProstgreSQL és MS SQL Server verziókban, de nem szerepel a MySQL, SQLite típusokban – ez utóbbi esetekben az előző union paranccsal tudjuk létrehozni.
A full join és cartesian join kapcsolata: két tábla cartesian join (minden adat mindegyikkel kapcsolva) és full join halmazainak metszete a két tábla inner join-ja.
Használatos a full join helyett a full outer join parancs, amely tartalmilag megegyezik.
SELF JOIN és tábla alias
Érdemes használni a tábla nevekre a lekérdezésekben aliast, mert megkönnyíti a hivatkozást:
select * from gepjarmu a, javitasok b
where a.car_azonosito = b.car_ID
Szükséges lehet önmagával kapcsolni a táblát (self-join). Ebben az esetben a két táblát alias-szal tudjuk megkülönböztetni. A következő példában szeretnénk kigyűjteni a dolgozo táblából minden dolgozóhoz a nálánál kevesebbet keresőket.
select * from dolgozo
name sal
---------- ----------
Nagy 7500
Balogh 7600
Kovács 7700
Szabó 7800
select * from dolgozo x, dolgozo y
where x.sal < y.sal
name sal name sal
---------- ---------- ---------- ----------
Nagy 7500 Balogh 7600
Nagy 7500 Kovács 7700
Balogh 7600 Kovács 7700
Nagy 7500 Szabó 7800
Balogh 7600 Szabó 7800
Kovács 7700 Szabó 7800
Változók, elágazások, ciklusok
Az SQL-t az idők során kiegészítették olyan tulajdonságokkal, hogy a programozók képesek legyenek benne bonyolult algoritmusokat is írni. Ez akkor válhat szükségessé, ha például komoly adatkezelési feladatokat szeretnénk az ügyféloldalról a kiszolgálóoldalra áthelyezni, az ott elérhető sokkal nagyobb teljesítmény miatt. De az is lehet, hogy csak egyszerűsíteni akarjuk a programozást felhasználói függvények létrehozásával (például szükségünk lenne egy olyan függvényre, ami a tajszámból kiszedi a szóközöket).
Az SQL nyelv részei a változókezelés, elágazások, ciklusok kezelése, kivételkezelés stb.
A legnagyobb különbségek az SQL kiszolgálók között éppen ezeknél a nyelvi elemeknél adódik: ahány gyártó, annyiféle megvalósítás.
Az egyéb nyelvi elemek szemléltetésére álljon itt egy Sybase ASA SQL példa:
CREATE FUNCTION DigitsOnly(IN M_Nev VARCHAR(30))
RETURNS VARCHAR(30)
BEGIN
DECLARE M_Result VARCHAR(16);
DECLARE i INTEGER;
SET i = 1;
SET M_Result = '';
WHILE (i <= LENGTH(M_Nev)) LOOP
IF SUBSTR(M_Nev, i, 1) BETWEEN '0' AND '9' THEN
SET M_Result = M_Result + SUBSTR(M_Nev, i, 1)
END IF;
SET i = i + 1;
END LOOP;
IF m_Result = '' THEN
RETURN(Null)
ELSE
RETURN(M_Result)
END IF;
END;
A fenti függvény a bemenetére küldött szövegből csak a számjegyeket hagyja meg.
Létrehoz egy adatbázis táblát, 4 oszloppal.
CREATE TABLE Szamla (
Szamlaszam NUMERIC(24),
Tulajdonos VARCHAR(60),
Nyitas DATE,
Allapot VARCHAR(1),
PRIMARY KEY (Szamlaszam)
);
Példa mMódosításra
ALTER TABLE Szamla
ALTER COLUMN Szamlaszam VARCHAR(26);
Megszüntetés index és adattábla
DROP INDEX Szamla_1;
DROP TABLE egy_tabla;
Tartalom törlése a táblából
TRUNCATE TABLE egy_tabla;
Lekérdezés formája
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
HAVING COUNT(*) > 1
ORDER BY Tulajdonos
A vevő neve mellett megjeleníti az eddigi rendeléseinek összegét is.
SELECT Vevo.Nev, (SELECT SUM(Osszeg) FROM Rendeles WHERE VevoID = Vevo.ID) RendelesOsszeg
A lekérdezés megkeresi a legnagyobb árbevételű munkáinkat – akkor használható jól, ha több is van belőle.
SELECT munka_szám FROM munka
WHERE óraszám*óradíj = (
SELECT max(óraszám*óradíj) FROM munka
SELECT *
FROM Beteg, Kezeles
WHERE Kezeles.Beteg_ID = Beteg.Beteg_ID
SELECT *
FROM Beteg
INNER JOIN Kezeles ON Kezeles.Beteg_ID = Beteg.Beteg_ID );
/* teljes tablazat lekerdezese */
SELECT * FROM ALKALMAZOTT;
/* projekcio, csak a kivalasztott oszlopok */
SELECT OSZT_AZON, NEV, FONOK FROM ALKALMAZOTT;
/* kifejezesek az oszlopokban */
/* eves fizetes */
SELECT NEV, FIZETES * 12 "EVES FIZETES" FROM ALKALMAZOTT;
/* szoveges oszlopok osszevonasa */
SELECT ALK_AZON||'-'||NEV DOLGOZO, 'OSZTALY', OSZT_AZON FROM ALKALMAZOTT;
/* NULL ertekek a kifejezesben */
SELECT NEV, FIZETES * 12 + JUTALOM "EVES JOVEDELEM" FROM ALKALMAZOTT;
SELECT NEV, FIZETES * 12 + NVL(JUTALOM, 0) "EVES JOVEDELEM" FROM ALKALMAZOTT;
/* duplikalt sorok elhagyása */
SELECT OSZT_AZON FROM ALKALMAZOTT;
SELECT DISTINCT OSZT_AZON FROM ALKALMAZOTT;
SELECT DISTINCT OSZT_AZON, BEOSZTAS FROM ALKALMAZOTT;
/* eredmeny sorok rendezese */
SELECT NEV, BEOSZTAS, FIZETES * 12, OSZT_AZON FROM ALKALMAZOTT
ORDER BY NEV;
/* csokkeno sorrend */
SELECT NEV, BEOSZTAS, BELEPES FROM ALKALMAZOTT
ORDER BY BELEPES DESC;
/* tob rendezesi szempont */
SELECT OSZT_AZON, BEOSZTAS, NEV FROM ALKALMAZOTT
ORDER BY OSZT_AZON, FIZETES DESC;
/* a rendezesi szempont az oszlop sorszamaval */
SELECT NEV, FIZETES FROM ALKALMAZOTT
ORDER BY 2;
/* válogatás a sorok kozul */
select * from alkalmazott where nev = 'SKOT';
select * from alkalmazott where fizetés < 1200';
select * from alkalmazott where belepes > '04-JUN-87';
select * from alkalmazott where jutalom >= 500;
select * from alkalmazott where fizetes between 1000 and 2000;
select * from alkalmazott where fonok in (7902, 7566, 7788);
select * from alkalmazott where nev like 'S%';
select * from alkalmazott where nev like '____';
select * from alkalmazott where fonok is null;
select * from alkalmazott where fonok is not null;
/* osszetett feltetelek */
select alk_azon, nev, beosztas, fizetes from alkalmazott
where sal between 1000 and 2000 and beosztas = 'ELOADO';
select alk_azon, nev, beosztas, fizetes from alkalmazott
where sal between 1000 and 2000 or beosztas = 'ELOADO';
/* osztalyok kodjai es nevei rendezve */
select oszt_azon, nev from osztaly order by oszt_azon;
/* kulonbozo beosztasok */
select distinct beosztas from alkalmazott;
/* 10-es és a 20-as osztalyon dolgozok nev szerint rendezve */
select * from alkalmazott
where oszt_azon in (10,20)
order by nev;
/* 20-as osztalyon dolgozo eloadok neve es beosztasa */
select nev, beosztas from alkalmazott where oszt_azon = 20;
/* "ES"-t vagy "IR"-t tartalmazo nevek */
select nev from alkalmazott
where nev like '%ES%' or nev like '%IR%';
/* nev, beosztas, fizetes azokra akiknek van fonokuk */
select nev, beosztas, fizetes from alkalmazott
where fonok is not null;
/* az 1981-ben belepett alkalmazottak */
select nev, oszt_azon, belepes from alkalmazott
where belepes like '%81';
select nev, oszt_azon, belepes from alkalmazott
where belepes between '01-JAN-81' and '31-DEC-81';
/* osszevont oszlopok */
select nev||' '||beosztas||' beosztasban dolgozik '||belepes||' ota'
"ki, mit csinal, mi ota" from alkalmazott;
/* valtozokat tartalmazo kifejezesek */
select nev, belepes from alkalmazott
where belepes between '&kezdo' and '&veg';
select nev, beosztas, fizetes, fonok, oszt_azon from alkalmazott
where beosztas = '&beosztas';
/* sqlplus valtozo hasznalata */
define eves = 'fizetes*12+nvl(jutalom,0)'
select nev, &eves from alkalmazott where &eves > 30000;
/* karakteres fuggvenyek */
/* nagybetusse alakitas */
select nev, beosztas from alkalmazott
where beosztas = upper ('&beosztas');
/* kisbetusse alakitas */
select lower(beosztas) from alkalmazott;
/* szavak kezdo betui nagy betuve */
select initcap(nev) from alkalmazott;
/* feltoltes jobbrol vagy balrol */
select rpad(nev, 10, '_') nev, lpad(beosztas, 10) beosztas,
lpad (oszt_azon, 7, '.') reszleg from alkalmazott;
/* karakterek eltavolitasa jobb vagy bal szelrol */
select rtrim(beosztas, 'KR'), ltrim(nev, 'SM') from alkalmazott;
/* sztring pozicioja az oszlopban */
select nev, instr(nev, 'A') from alkalmazott;
/* sztring hossza */
select nev, length(nev) from alkalmazott;
/* karakterek csereje, ekezetek nelkuli kiiratas */
select translate(nev, 'ÁÉÓÖÔÚÜŰ', 'AEOOOUUU') from alkalmazott;
/* fuggvenyek egymasba agyazasa, E betuk szama a nevekben */
select nev, length(nev)-length(replace(nev, 'E')) E from alkalmazott;
/* numerikus fuggvények */
/* kerekites */
define x=fizetes/30
select &x, round(&x), round(&x,2), round(&x,-1) from alkalmazott
where oszt_azon = 10;
/* csonkitas */
select &x, trunc(&x), trunc(&x,2), trunc(&x,-1) from alkalmazott
where oszt_azon = 10;
/* fizetes 15%-al novelt erteke */
select nev, round(fizetes*1.15) "novelt fizetes" from alkalmazott;
/* datum fuggvenyek */
/* aktualis datum lekerdezese */
select sysdate from sys.dual;
/* aritmetikai muveletek datumokkal */
select belepes, belepes+7, sysdate-belepes from alkalmazott
where oszt_azon = 10;
/* kulonbseg honapokban, a 160 honapnal regebben belepett alkalmazottak */
select nev, belepes, months_between(sysdate, belepes)
from alkalmazott
where months_between(sysdate, belepes) > 160;
/* honapok hozzaadasa, levonasa */
select add_months(sysdate, 2) from sys.dual;
select add_months(sysdate, -5) from sys.dual;
/* kovetkezo nap */
select next_day(sysdate, 'SUNDAY') from sys.dual;
/* honap utolso napja */
select last_day(sysdate) from sys.dual;
/* datum kerekites */
select sysdate, round(sysdate, 'month'), round(sysdate, 'year') from sys.dual;
/* datum csonkitas */
select sysdate, trunc(sysdate, 'month'), trunc(sysdate, 'year') from sys.dual;
/* konverzios fuggvenyek */
/* szam sztringge alakitas */
select nev, to_char(fizetes, '$9,999') from alkalmazott
where beosztas = 'MANAGER';
/* datum sztringge alakitas */
select to_char(sysdate, 'yyyy month dd day') from sys.dual;
/* ido es datum */
select to_char(sysdate, 'yyyy.mm.dd HH:MI:SS') from sys.dual;
/* mahoz 2 evre milyen nap lesz */
select to_char(add_months(sysdate, 24), 'DAY') from sys.dual;
/* sztring datumma alakitas */
select to_date('96.11.20', 'YY.MM.DD') from sys.dual;
/* csoport fuggvenyek */
/* teljes tablara */
select min(fizetes), max(fizetes), sum(fizetes), avg(fizetes), count(fizetes)
from alkalmazott;
/* csoportokra */
select oszt_azon, min(fizetes), max(fizetes), sum(fizetes), avg(fizetes), count(fizetes)
from alkalmazott
group by oszt_azon;
/* valogatas a csoportok kozul */
select oszt_azon, avg(fizetes) from alkalmazott
group by oszt_azon having count(*) > 3;
/* valogatas a sorok es csoportok kozul is */
select oszt_azon, avg(fizetes) from alkalmazott
where beosztas != 'ELOADO'
group by oszt_azon having min(fizetes) > 1000;
/* beosztasonkent a legkisebb fizetes */
select beosztas, min(fizetes) MIN, max(fizetes) MAX from alkalmazott
group by beosztas;
/* managerek szama */
select count(*) from alkalmazott where beosztas = 'MANAGER';
/* lekerdezes tobb tablabol */
/* egyen osszekapcsolas */
select alkalmazott.nev, beosztas, osztaly.nev from alkalmazott, osztaly
where alkalmazott.oszt_azon = osztaly.oszt_azon;
/* Descartes szorzat, osszekapcsolas minden kombinacioban */
select osztaly.nev, alkalmazott.nev from osztaly, alkalmazott;
/* nem egyen osszekapcsolas */
select a.nev, a.fizetes, f.f_oszt from alkalmazott a, fiz_oszt f
where a.fizetes between f.min and f.max;
/* Budapesten dolgozok nevsora */
select a.nev from alkalmazott a, osztaly o
where a.oszt_azon = o.oszt_azon and o.varos = 'BUDAPEST';
/* kulso osszekapcsolas */
select o.oszt_azon, o.nev, a.nev from alkalmazott a, osztaly o
where a.oszt_azon (+) = o.oszt_azon;
/* tabla osszekapcsolasa onmagaval */
/* fonok beosztott parok */
select a.nev fonok, b.nev beosztott from alkalmazott a, alkalmazott b
where b.fonok = a. alk_azon;
select a.nev fonok, b.nev beosztott from alkalmazott a, alkalmazott b
where b.fonok = a. alk_azon (+);
/* alkalmazottak akik a fonokuk elott leptek be */
select a.nev BEOSZTOTT, a.belepes, b.nev FÔNÖK, b.belepes
from alkalmazott a, alkalmazott b
where a.fonok = b.alk_azon and a.belepes < b.belepes;
/* halmaz muveletek */
/* unio osztalyok, ahol manager vagy ugynok dolgozik */
select distinct oszt_azon from alkalmazott
where beosztas = 'MANAGER'
union
select distinct oszt_azon from alkalmazott
where beosztas = 'UGYNOK';
/* metszet, azok az osztalyok amelyeknek van dolgozoja */
select distinct oszt_azon from alkalmazott
intersect
select oszt_azon from osztaly;
/* kulonbseg, azok az osztalyok, ahol nem dolgozik senki */
select oszt_azon from osztaly
minus
select oszt_azon from alkalmazott;
/* egymasba agyazott lekerdezesek */
/* legkisebb fizetesu dolgozo */
select nev, fizetes from alkalmazott
where fizetes = (select min(fizetes) from alkalmazott);
/* szaboval azonos munkakorben dolgozok */
select nev, beosztas from alkalmazott
where beosztas = (select beosztas from alkalmazott
where nev = 'SZABO');
/* legkisebb fizetesu dolgozo osztalyonkent */
select nev, fizetes, oszt_azon from alkalmazott
where (fizetes, oszt_azon) in
(select min(fizetes), oszt_azon from alkalmazott
group by oszt_azon);
/* 30-as minimum fizetesenel tobbet keresok */
select nev, beosztas, fizetes from alkalmazott
where fizetes > any
(select fizetes from alkalmazott
where oszt_azon = 30);
/* a 30-as osztalyon legtobbet keresonel magasabb fizetesuek */
select fizetes, beosztas, nev from alkalmazott
where fizetes > all
(select fizetes from alkalmazott where oszt_azon = 30);
/* legmagasabb atlagfizetesu beosztas */
select beosztas, avg(fizetes) from alkalmazott
group by beosztas
having avg(fizetes) =
(select max(avg(fizetes)) from alkalmazott
group by beosztas);
/* korrelacio */
/* akiknek nagyobb a fizetesuk, mint az osztaly atlag */
select oszt_azon, nev, fizetes from alkalmazott a
where fizetes > (select avg(fizetes) from alkalmazott
where oszt_azon = a.oszt_azon)
order by oszt_azon;
/* akiknek legalabb egy beosztottja van */
select nev, beosztas, oszt_azon from alkalmazott a
where exists (select * from alkalmazott
where fonok = a.alk_azon);
/* osztolyonkent az utolsonak belepett dolgozo */
select oszt_azon, nev, belepes from alkalmazott
where (oszt_azon, belepes) in (select oszt_azon, max(belepes)
from alkalmazott group by oszt_azon)
order by belepes dec;
/* osztaly amelyiknek nincs dolgozoja */
select nev from osztaly o
where not exists (select * from alkalmazott
where oszt_azon = o.oszt_azon);
/* az az osztaly, ahol legmagasabb az eves atlagjovedelem */
define x=fizetes * 12+nvl(jutalek,0)
select oszt_azon, avg(&x) from alkalmazott
group by oszt_azon
having avg(&x) = (select max(avg(&x)) from alkalmazott
group by oszt_azon);
===========================================================
/* Demo tablak feltoltese */
/* set termout off */
DROP TABLE ALKALMAZOTT;
DROP TABLE OSZTALY;
DROP TABLE FIZ_OSZT;
DROP TABLE DUMMY;
DROP SEQUENCE AZON;
DROP VIEW OSZT_ATLAG;
DROP VIEW BEOSZT_ATLAG;
CREATE TABLE OSZTALY (
OSZT_AZON NUMBER(2) NOT NULL,
NEV VARCHAR(14),
VAROS VARCHAR(13));
INSERT INTO OSZTALY VALUES (10,'SZAMLAZAS','BUDAPEST');
INSERT INTO OSZTALY VALUES (20,'KUTATAS','ESZTERGOM');
INSERT INTO OSZTALY VALUES (30,'RAKTAR','BUDAORS');
INSERT INTO OSZTALY VALUES (40,'FORGALMAZAS','BUDAPEST');
CREATE TABLE ALKALMAZOTT (
ALK_AZON NUMBER(4) NOT NULL,
NEV VARCHAR(10),
BEOSZTAS VARCHAR(9),
FONOK NUMBER(4),
BELEPES DATE,
FIZETES NUMBER(7,2),
JUTALOM NUMBER(7,2),
OSZT_AZON NUMBER(2) NOT NULL);
INSERT INTO ALKALMAZOTT VALUES (7839,'KIRALY','ELNOK',NULL,'17-NOV-81',5000,NULL,10);
INSERT INTO ALKALMAZOTT VALUES (7698,'BIRO','MANAGER',7839,'1-MAY-81',2850,NULL,30);
INSERT INTO ALKALMAZOTT VALUES (7782,'CSALO','MANAGER',7839,'9-JUN-81',2450,NULL,10);
INSERT INTO ALKALMAZOTT VALUES (7566,'JONAS','MANAGER',7839,'2-APR-81',2975,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7654,'MARTON','UGYNOK',7698,'28-SEP-81',1250,1400,30);
INSERT INTO ALKALMAZOTT VALUES (7499,'ALI','UGYNOK',7698,'20-FEB-81',1600,300,30);
INSERT INTO ALKALMAZOTT VALUES (7844,'TURCSI','UGYNOK',7698,'8-SEP-81',1500,0,30);
INSERT INTO ALKALMAZOTT VALUES (7900,'JENES','ELOADO',7698,'3-DEC-81',950,NULL,30);
INSERT INTO ALKALMAZOTT VALUES (7521,'VAMOS','UGYNOK',7698,'22-FEB-81',1250,500,30);
INSERT INTO ALKALMAZOTT VALUES (7902,'FINESZ','ELEMZO',7566,'3-DEC-81',3000,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7369,'SZABO','ELOADO',7902,'17-DEC-80',800,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7788,'SKOT','ELEMZO',7566,'09-DEC-82',3000,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7876,'ADAM','ELOADO',7788,'12-JAN-83',1100,NULL,20);
INSERT INTO ALKALMAZOTT VALUES (7934,'MULLER','ELOADO',7782,'23-JAN-82',1300,NULL,10);
CREATE TABLE FIZ_OSZT (
F_OSZT NUMBER,
MIN NUMBER,
MAX NUMBER);
INSERT INTO FIZ_OSZT VALUES (1,700,1200);
INSERT INTO FIZ_OSZT VALUES (2,1201,1400);
INSERT INTO FIZ_OSZT VALUES (3,1401,2000);
INSERT INTO FIZ_OSZT VALUES (4,2001,3000);
INSERT INTO FIZ_OSZT VALUES (5,3001,9999);
CREATE TABLE DUMMY (
DUMMY NUMBER );
INSERT INTO DUMMY VALUES (0);
CREATE SEQUENCE AZON
INCREMENT BY 1
START WITH 7935
NOCACHE;
CREATE VIEW OSZT_ATLAG AS
SELECT OSZTALY.NEV, AVG(FIZETES) ATLAG FROM OSZTALY, ALKALMAZOTT
WHERE OSZTALY.OSZT_AZON = ALKALMAZOTT.OSZT_AZON
GROUP BY OSZTALY.NEV;
CREATE VIEW BEOSZT_ATLAG AS
SELECT BEOSZTAS, AVG(FIZETES) ATLAG FROM ALKALMAZOTT
GROUP BY BEOSZTAS;
COMMIT;
http://aries.ektf.hu/~holovacs/AB/5_SQL_2.htm
Nincsenek megjegyzések:
Megjegyzés küldése