SQL příklady - půjčovna lodí:



1. Seznam člunů (BID, BNAME), které nikdy nejely na pravidelné lince (nejsou v tabulce pokrytí).
   select BID, BNAME from BOAT
   where BID not in (select BID from REG_LINE_REL_COVER);

         BID BNAME
---------- --------------------
         3     Skyla
         4     Pooh
         7     Yeanifer

2. Seznam námořníků (SNAME, AGE), kteří jeli jako průvodci na žluté lodi typu "SUBMARINE".
   select distinct SNAME, AGE
   from SAILOR S, SAIL_WITH_GUIDE SG, BOAT B
   where S.SID = SG.SID and B.BID = SG.BID and
         COLOR = 'yellow' and BTYPE = 'submarine' ;

SNAME                               AGE
-------------------- ----------
Zorba                                16

3. Kolik zelených členů je registrováno v půjčovně?
   select count(*) "Green Boats"
   from BOAT
   where COLOR = 'green';

Green Boats
-----------
          2

4. Jaký je průměrný věk námořníků?
   select avg(AGE) as "Avagage Age of Sailors"
   from SAILOR;

Avagage Age of Sailors
----------------------
            130.181818

5. Najděte námořníky (SID, SNAME), kteří jeli alespoň třikrát pravidelnou linku.
   select SID, SNAME
   from SAILOR S
   where  4 <= (select count(*)
                from REG_LINE_REL_COVER R
                where S.SID = R.SID);

       SID         SNAME
---------- --------------------
         8         Brutus
        11         Charon

6.  Jména námořníků a počet jejich  plaveb coby průvodce, výstup seřaďte podle vzestupně podle počtu plaveb.
   select SNAME, SG_TIMES "Number of Sails"
   from SAILOR S, (select count(*)as SG_TIMES, SID
                   from SAIL_WITH_GUIDE
                   group by SID) NS
   where S.SID = NS.SID
   order by SG_TIMES;

SNAME                Number of Sails
-------------------- ---------------
Dustin                             1
Rusty                              1
Horatio                            1
Lubber                             4
Marco                              5
Zorba                              7

7. Jména námořníků a počet jejich plaveb coby průvodece, vypusťte námořníky, kteří jeli méně než třikrát, výstup seřaďte sestupně podle počtu plaveb.
   select SNAME, SG_TIMES "Number of Sails"
   from SAILOR S, (select count(*) as SG_TIMES, SID
                   from SAIL_WITH_GUIDE
           group by SID) NS
   where SG_TIMES > 3 and S.SID = NS.SID
   order by SG_TIMES;

SNAME                Number of Sails
-------------------- ---------------
Lubber                             4
Marco                              5
Zorba                              7

8. Seznam námořníků a počet jejich plaveb (coby průvodce i na linkách). Výstup seřaďte podle počtu plaveb.
   select SNAME, nvl(SG_TIMES,0) + nvl(RG_TIMES,0)  as  "Total # of Sails"
   from SAILOR S, (select count(*) as SG_TIMES, SID
                   from SAIL_WITH_GUIDE
                   group by SID) RG,
                   (select count(*) as RG_TIMES, SID
                   from REG_LINE_REL_COVER
                   group by SID) SG
 where S.SID = RG.SID(+) and S.SID = SG.SID(+)
 order by "Total # of Sails", SNAME ;

SNAME                Total # of Sails
-------------------- ----------------
Guppy                               0
Dustin                              1
Horatio                             1
John                                2
Yuppy                               2
Brutus                              4
Rusty                               4
Charon                              5
Lubber                              6
Marco                               7
Zorba                               7

9. Vytvořte pohle Favorit_Boats (BID, BNAME, COLOR, TYPE). Jsou zde čluny, které byly pronajaty k soukromé plavbě více než dvakrát.
   create or replace view FAVORITE_BOATS as
   select BID, BNAME, COLOR, BTYPE
   from BOAT B
   where 2 <= (select count(*)
               from SAIL_WITH_GUIDE SG
               where B.BID = SG.BID);
 
  select * from favorite_boats;

       BID BNAME                COLOR                BTYPE
------- -------------------- -------------------- --------------------
      1 Jane                 yellow               submarine
      9 Anne                 green
     10 Lilien               blue                 clipper

10. Vytvořte pohled Popular_Sailor (SID, SNAME, AGE). Jsou zde námořníci, kteří jeli více jak 5x (jako průvodci nebo na pravidelné lince)
   create or replace view POPULAR_SAILOR as
   select S.SID, SNAME, AGE
   from SAILOR S, (select count(*) as SG_TIMES, SID
                   from SAIL_WITH_GUIDE
                   group by SID) RG,
                   (select count(*) as RG_TIMES, SID
                   from REG_LINE_REL_COVER
                   group by SID) SG
   where S.SID = RG.SID(+) and S.SID = SG.SID(+)
       and (nvl(SG_TIMES,0) + nvl(RG_TIMES,0)) > 5;

   select * from popular_sailor;

       SID SNAME                       AGE
---------- -------------------- ----------
         2 Lubber                       55
         6 Zorba                        16
         9 Marco                        26


11. Pokuste se vložit nového námořníka jménem Yarwen, 23 let, rating 8.
insert into sailor values (12, 'Yarvin', 23, 8);

1 row created.

SQL> commit;

Commit complete.

12. Pokuste se vložit nového námořníka jménem Dustin, 56 let, rating 9.
insert into sailor values (13, 'Dustin', 56, 9);
insert into sailor values (13, 'Dustin', 56, 9)
*
ERROR at line 1:
ORA-00001: unique constraint (OPS$VALENTA.SAILOR_UK) violated

13. Zkuste z databáze vymazat loď jménem Pooh.
 delete from boat
     where BNAME = 'Pooh';

1 row deleted.

SQL> rollback;

Rollback complete.

14 Zkuste z databáze vymazat loď jménem Jane.
 delete from boat
    where BNAME = 'Jane';

delete from boat
*
ERROR at line 1:
ORA-02292: integrity constraint (OPS$VALENTA.SAIL_WITH_GUIDE_FK2) violated -
child record found

15 Změnte barvu lodi Yenifer z černé na modrou.
update BOAT
    set COLOR = 'blue'
    where BNAME = 'Yeanifer';

1 row updated.

SQL> commit;

Commit complete.

16. Zkuste změnit BID člunu 5 na hodnotu 13.
update BOAT
     set BID = 13
     where BID = 5;

update BOAT
*
ERROR at line 1:
ORA-02292: integrity constraint (OPS$VALENTA.REG_LINE_REL_COVER_FK2) violated -
child record found