Version: 5. félév

6. Gyakorlat

DOLGOZO tábla feladatok#

  1. Adjuk meg mennyi a dolgozók között előforduló maximális fizetés.

  2. Adjuk meg mennyi a dolgozók között előforduló minimális fizetés.

  3. Adjuk meg mennyi a dolgozók között előforduló átlagfizetés.

  4. Adjuk meg a dolgozó tábla sorainak számát.

  5. Adjuk meg hányan dolgoznak az egyes osztályokon.

  6. Adjuk meg azokra az osztályokra az átlagfizetést, ahol ez nagyobb mint 2000.

  7. Adjuk meg az átlagfizetést azokon az osztályokon, ahol legalább 4-en dolgoznak (oazon, avg_fiz)

    π oazon, avg σ db ≥ 4 γ oazon; avg(fizetes)->avg, count(*)->db (dolgozo)

    select oazon, avg(fizetes) from dolgozo group by oazon having count(*)>4;
  8. Adjuk meg az átlagfizetést és telephelyet azokon az osztályokon, ahol legalább 4-en dolgoznak.

  9. Adjuk meg azon osztályok nevét és telephelyét, ahol az átlagfizetés nagyobb mint 2000. (onev, telephely)

    π oazon, telephely σ avg ≥ 2000 γ oazon, telephely; avg(fizetes)->avg, count(*)->db (dolgozo ⨝ osztaly)

    select osztaly.oazon, osztaly.telephely
    from dolgozo, osztaly
    where dolgozo.oazon=osztaly.oazon
    group by osztaly.oazon, osztaly.telephely
    having avg(dolgozo.fizetes)>2000;
  10. Adjuk meg azokat a fizetési kategóriákat, amelybe pontosan 3 dolgozó fizetése esik.

    π kategoria σ db = 3 γ kategoria; count(*)->db (σ dolgozo.fizetes >= fiz_kategoria.also and fizetes <= fiz_kategoria.felso (dolgozo ⨯ fiz_kategoria))

    SELECT kategoria from
    (
    select * from dolgozo, fiz_kategoria
    where dolgozo.fizetes between fiz_kategoria.also and fiz_kategoria.felso
    )
    group by kategoria having count(*)=3;
  11. Adjuk meg azokat a fizetési kategóriákat, amelyekbe eső dolgozók mindannyian ugyanazon az osztályon dolgoznak.

    π kategoria, db σ db =1 γ kategoria; count(oazon)->db (σ dolgozo.fizetes >= fiz_kategoria.also and fizetes <= fiz_kategoria.felso (dolgozo ⨯ fiz_kategoria))

    SELECT kategoria, count(distinct oazon) from
    (
    select * from fiz_kategoria, dolgozo
    where dolgozo.fizetes between fiz_kategoria.also and fiz_kategoria.felso
    )
    group by kategoria having count(distinct oazon)=1;
  12. Adjuk meg azon osztályok nevét és telephelyét, amelyeknek van 1-es fizetési kategóriájú dolgozója.

    π oazon, telephely σ kategoria =1 ∧ dolgozo.fizetes>= fiz_kategoria.also ∧ dolgozo.fizetes<=fiz_kategoria.felso (dolgozo⨝osztaly⨯fiz_kategoria)

    SELECT oazon, telephely from (
    select osztaly.telephely, dolgozo.oazon, fiz_kategoria.kategoria
    from fiz_kategoria, dolgozo, osztaly
    where kategoria=1 and dolgozo.oazon=osztaly.oazon
    and dolgozo.fizetes between fiz_kategoria.also and fiz_kategoria.felso
    ) group by oazon, telephely;
  13. Adjuk meg azon osztályok nevét és telephelyét, amelyeknek legalább 2 fő 1-es fiz. kategóriájú dolgozója van.

    π oazon, telephely σ db ≥ 2 γ oazon, telephely; count(*)->db σ kategoria = 1 ∧ dolgozo.fizetes>= fiz_kategoria.also ∧ dolgozo.fizetes<=fiz_kategoria.felso (dolgozo⨝osztaly⨯fiz_kategoria)

    SELECT oazon, telephely from (
    select osztaly.telephely, dolgozo.oazon, fiz_kategoria.kategoria
    from fiz_kategoria, dolgozo, osztaly
    where kategoria=1 and dolgozo.oazon=osztaly.oazon
    and dolgozo.fizetes between fiz_kategoria.also and fiz_kategoria.felso
    ) group by oazon, telephely having count(*)>=2;
  14. Készítsünk listát a páros és páratlan azonosítójú (dkod) dolgozók számáról.

    SELECT DECODE(MOD(dkod,2),0,'ptlan', 'paros') AS Paritas,
    COUNT(*) AS Letszam FROM dolgozo GROUP BY MOD(dkod,2);
  15. Listázzuk ki munkakörönként a dolgozók számát, átlagfizetését (kerekítve) numerikusan és grafikusan is. 200-anként jelenítsünk meg egy #-ot

    SELECT foglalkozas, COUNT(*) AS darab, ROUND(AVG(fizetes)) AS atlagfiz,
    RPAD(' ',ROUND(AVG(fizetes))/200+1, '#') as grafika FROM dolgozo
    GROUP BY foglalkozas ORDER BY ROUND(AVG(fizetes));

HAJO tábla feladatok#

create table hajok as select * from nikovits.hajok;
create table csatak as select * from nikovits.csatak;
create table kimenetelek as select * from nikovits.kimenetelek;
  • Adjuk meg azokat a hajóosztályokat a gyártó országok nevével együtt, amelyeknek az ágyúi legalább 16-os kaliberűek.
    select osztaly,orszag from hajoosztalyok where kaliber >=16;
  • Melyek azok a hajók, amelyeket 1921 előtt avattak fel?
    select * from hajok where felavatva < '1921';
  • Adjuk meg a Denmark Strait-csatában elsüllyedt hajók nevét.
    select * from csatak, kimenetelek where
    csatak.csatanev=kimenetelek.csatanev and kimenetelek.eredmeny='elsullyedt'
    and kimenetelek.csatanev='Denmark Strait';
  • Az 1921-es washingtoni egyezmény betiltotta a 35000 tonnánál súlyosabb hajókat. Adjuk meg azokat a hajókat, amelyek megszegték az egyezményt. (1921 után avatták fel őket)
    select * from hajok, hajoosztalyok where hajok.osztaly=hajoosztalyok.osztaly
    and felavatva > '1921' and hajoosztalyok.vizkiszoritas>35000;
  • Adjuk meg a Guadalcanal csatában részt vett hajók nevét, vízkiszorítását és ágyúi­nak a számát.
    --megoldas 1
    select * from hajok, csatak, kimenetelek, hajoosztalyok
    where hajoosztalyok.osztaly=hajok.osztaly
    and kimenetelek.hajonev=hajok.hajonev
    and csatak.csatanev=kimenetelek.csatanev
    and csatak.csatanev='Guadalcanal';
    --megoldas 2
    select * from (hajok natural join csatak
    natural join kimenetelek natural join hajoosztalyok)
    where csatanev='Guadalcanal';
  • Adjuk meg az adatbázisban szereplő összes hadihajó nevét. (Ne feledjük, hogy a Hajók relációban nem feltétlenül szerepel az összes hajó!)
    select hajok.hajonev from hajok where osztaly in
    (select osztaly from hajoosztalyok where tipus='bc')
    union (select hajonev from kimenetelek);
Last updated on