background image

 

 
 
 

background image

 

 

 
 

 

1. 
select id_pokoju from rezerwacje where data_przyjazdu>=”1.5.2006” and  
data_wyjazdu<=”31.5.2006” group by 1 having sum (data_wyjazdu-data_przyjazdu)<=21; 

 
 

background image

2. 
 Selekt distinct nazwisko frm rezerwacje r, statusy s, klienci k, pokoje p, typy_pokoi t where  
r.status_id=status_id.s and r.id_klienta=id_klienta.k and r.id_pokoju=id_pokoju.p and 
p.typ_id=typ_id.t and nazwa_statusu=”klient wyjechał” and ilość_osob=1 and  
data_przyjazdu>=’1.1.07’ and data_wyjazdu<=’21.1.07’; 
 
3. 
Create table Temp (typ_id[primary key],suma_pokoi,ile_dob); 
 
Insert into temp (typ_id, suma_pokoi) values 
(select typ_id, count(id_pokoju) from pokoje group by typ_id; 
 
Insert into temp (ile_dob) values 
(select typ_id, sum(data_wyjazdu-data_przyjazdu) from rezerwacje, pokoje where 
data_przyjazdu>=

data Ŝeby spełnic załoŜenie z cwiczenia

 and data_wyjazdu 

data Ŝeby spełnic 

załoŜenie z cwiczenia

); 

 
Selekt typ_id, (ile_dob/92*100)+’%’as wykorzystanie from temp; 
 
4.>>czy klient juŜ figuruje w bazie? 
Selekt id_klienta from klienci where imie=’

imie twojego klienta

’ and nazwisko=’

nazwisko 

twojego klienta

’ and rok ur=’

wiadomo

’; 

Zwraca id klienta jeśli taki istnieje 
A gdy nie ma klienta to: 
Insert into klienci(id__klienta, imie, nazwisko,rok_ur) values (identity, ’

imie twojego klienta

’, 

nazwisko twojego klienta

’,1983); 

No to szukamy wolnego pokoju 
Selekt min(id_pokoju) from pokoje p, typy_pokoi t where p.typ_id=typ_id.t and ilość osob=1 
and numer not In (select numer from rezerwacje where data przyjazdu>=’

wymysl,logiczne 

mysenie nie boli

’ and data_wyjazdu<=

 ‘wymysl’

) ; 

No to rezerwujemy pokoik dla klienta☺ 
Insert into rezerwacje (id_rezerwacji, 
id_klienta,id_pokoju,cena,data_rezerwacji,data_przyjazdu,data_wyjazdu, status_id) 
Values( identity, 

pozostałe atrybuty wpiszcie sami, przecieŜ nie moŜecie mieć dokładnie tak 

samo, jeśli zaliczyliście ćwiczenia to składnie polecenia chyba znacie :P

); 

 
5.ile razy klient był w hotelu? 
Selekt count(id_rezerwacji) from rezerwacje r, klienci k, statusy s  
Where k.id_klienta=id_klienta.r and r.status_id=status_id.s and imie=”Kunegunda” and 
nazwisko=”brzeczyszczykiewicz” and rok_ur=1940 and data_przyjazdu>

’data zgodnie z 

poleceniem

’ and nazwa_statusu=”klient wyjechał”; 

 
6. sprawdźmy czy wszyscy goście dotarli do hotelu☺ 
Selekt imie, nazwisko, id_pokoju, nazwa_statusu from rezerwacje r, klienci k, statusy s 
Where  r.id_klienta=id_kienta.k and data_przyjazdu=’

zalukaj do zadania o jaka date chodzi

’ 

And nazwa_statusu=’oczekiwanie na klienta’ And nazwa_statusu=’klient przybył’; 
 
 
 
 

background image

7. 
Selekt typy_pokoi, nazwa, sum(cena) from rezerwacje r, pokoje p, 
Typy_pokoi t where data_przyjazdu>=’

zalukaj do zadania o jaka date chodzi

’ 

And data wyjazdu <=’

i tu teŜ

’ group by 1; 

 
8.rachunek 
Update rezerwacje set status_id=3 /*klient wyjechał*/ where id_rezerwacji=’43’ 
Selekt imie, nazwisko, cena, data_przyjazdu, data_wyjazdu from klienci k, rezerwacje r 
Where k.id_klienta=id_klienta.r and id rezerwacji=46; 
 
9. najgorsze 
Pokarz wszystkie wolne pokoje i zajęte wg kategorii 
 
Wolne pokoje 
Create table wolne_pokoje (typ_id,liczba) 
Insert into wolne pokoje (typ_id,liczba) values (selekt typ_id, count(*) from rezerwacje, 
statusy, pokoje where”

dzisiejsza data

” not between data_przyjazdu and data_wyjazdu and 

nazwa statusu=”klient w hotelu” group by 1); 
 
Zajęte pokoje 
Create table zajete_pokoje (typ_id,liczba) 
Insert into zajete pokoje (typ_id,liczba) values (selekt typ_id, count(*) from rezerwacje, 
statusy, pokoje where”

dzisiejsza data

” between data_przyjazdu and data_wyjazdu and nazwa 

statusu=”klient w hotelu” group by 1); 
 
Zestawienie 
Selekt nazwa_typu w.liczba as [licza wolnych], z.liczba as [liczba zajetycz] from typy_pokoi 
t,wolne_pokoje w,zajęte pokoje z where t.typ_id=typ_id.w and t.typ_id=typ_id.z 
 
 

Czytajcie uwaŜnie co i jak przepisujecie!!!!! 

Czytajcie polecenia 

 
Kolejne zadanie opracowane przez Grzegorza 
 

a)

 

Wypisz działy (NUMDZ, NAZWADZ, i LOK), które mają kierownika (kierowników) 
zatrudnionego w firmie po swoim podwładnych i zarabiających więcej niŜ wynosi 
ś

rednia pensja w dziale; 

 

/* Krok 1 – wyliczenie 

ś

redniej pensji oraz date ost. zatrudnia w 

dz. */ 
INSERT INTO DZIAŁ_SR (NUMDZ, D_SR_ZAROB, D_OSTATNIE_ZATR)  
SELECT NUMDZ, AVG(ZAROB), MAX(ZATRUD) FROM PRAC GROUP BY NUMDZ 
 
/* Krok 2 – wyszukanie pracowników i odpowiadaj

ą

cym im działów */ 

SELECT DZIAŁ.NUMDZ, DZIAŁ.NAZWADZ, DZIAŁ.LOK 
FROM PRAC, DZIAŁ, DZIAŁ_SR 
WHERE PRAC.NUMDZ=DZIAŁ.NUMDZ AND PRAC.NUMDZ=DZIAŁ_SR.NUMDZ AND  
PRAC.ZAROB > DZIAŁ_SR.D_SR_ZAROB AND 
PRAC.ZATRUD=DZIAŁ_SR.D_OSTATNIE_ZATR 

 

background image

b)

 

Oblicz, jaki procent sumy wszystkich pensji (pensji ogółem) w firmie stanowi pensja 
kaŜdego pracownika; 

 
/* Krok 1 – wyliczenie sumy zarobków */ 
INSERT INTO SUMA_ZAROB (SUMA_ZAROB) SELECT SUM(ZAROB) FROM PRAC; 
 
/* Krok 2 – wyliczenie procentów */ 
SELECT PRAC.NAZWAP, PRAC.ZAROB/SUMA_ZAROB*100+’%’ AS PROCENT 
FROM PRAC, SUMA_ZAROB 
 

c)

 

Wypisz stanowiska w poszczególnych działach obsadzone przez dwóch lub więcej 
pracowników, którzy zarabiają więcej niŜ wynosi średnia wszystkich pracowników i 
którzy zostali zatrudnieni po 12.02.2002 roku. 

 
/* Krok 1 – wyliczenie 

ś

redniej wszystkich pracowników */ 

INSERT INTO PRAC_SR_ZAROB (SR_ZAROB) SELECT AVG(ZAROB) FROM PRAC; 
 
/* Krok 2 – wyszukanie stanowisk 
SELECT DZIAŁ.NAZWADZ, PRAC.STANOWISKO 
FROM PRAC, DZIAŁ, PRAC_SR_ZAROB 
WHERE PRAC.NUMDZ=DZIAŁ.NUMDZ AND  
PRAC.ZAROB > PRAC_SR_ZAROB. SR_ZAROB AND PRAC.ZATRUD > ‘2002-02-12’ 
GROUP BY DZIAŁ.NAZWADZ, PRAC.STANOWISKO 
HAVING COUNT(*) >= 2 
 

d)

 

Wypisz nazwy wszystkich działów wraz z nazwiskami ich kierowników (pracownik 
działu, którego stanowisko = KIEROWNIK, w kaŜdym dziale pracuje tylko jeden 
kierownik) 

 
SELECT PRAC.NAZWP, DZIAŁ.NAZWADZ 
FROM DZIAŁ, PRAC 
WHERE PRAC.NUMDZ=DZIAŁ.NUMDZ AND PRAC.STANOWISKO=’KIEROWNIK’ 

 

e)

 

Ustaw pracowników zarabiających ponad 3000$ we wszystkie moŜliwe pary w ten 
sposób, aby po lewej stronie w parze znajdował się pracownik z pensją większą niŜ 
pensja pracownika po prawej stronie. Wypisz wartości NAZWP i ZAROB dla obu 
pracowników w parze. Kolumny nazwij następująco NAZWP GÓRNE, GÓRNE, 
NAZWP_DOLNE, DOLNE. Posortuj tak, aby wartości w kolumnie GÓRNE były 
ustawione od najwyŜszej do najniŜszej. 

 
SELECT P1.NAZWP AS [NAZWP GÓRNE], P1.ZAROB AS GÓRNE,  
P2.NAZWP AS [NAZWP DOLNE], P2.ZAROB AS DOLNE  
FROM PRAC P1, PRAC P2 
WHERE P1.ZAROB > 3000 AND P2.ZAROB > 3000 AND P1.ZAROB > P2.ZAROB 
ORDER BY 2 DESC 
 

f)

 

WskaŜ wszystkich urzędników, którzy pracują w dziale 10 i których nazwisko nie 
rozpoczyna się na literę Z oraz których pensja jest większa niŜ pensja sprzedawców. 
Podaj ID pracownika, nazwisko, stanowisko i zarobki. 

 
/* Krok 1 – wyliczenie 

ś

redniej pensji sprzedawców */ 

INSERT INTO SPRZEDAWCY_SR_ZAROB (SR_ZAROB)  
SELECT AVG(ZAROB) FROM PRAC WHERE STANOWISKO=’SPRZEDAWCY’; 
 
/* Krok 2 – wyszukanie urz

ę

dników */ 

SELECT PRAC.NUMP, PRAC.NAZWP, PRAC.STANOWISKO, PRAC.ZAROB  
FROM PRAC, SPRZEDAWCY_SR_ZAROB  

background image

WHERE PRAC.NUMDZ=10 AND PRAC.NAZWP NOT LIKE ‘Z%’ AND  
PRAC.ZAROB > SPRZEDAWCY_SR_ZAROB.SR_ZAROB 

 
g)

 

WskaŜ pracowników na stanowisku KIEROWNIK, którzy nie maja podwładnych na 
stanowisku ANALITYK i których zarobki są większe od zarobków średnich 
ANALITYKÓW. 

 
/* Krok 1 – wyliczenie AVG(ZAROB) analityków */ 
INSERT INTO ANALITYK_SR_ZAROB (SR_ZAROB)  
SELECT AVG(ZAROB) FROM PRAC WHERE STANOWISKO=’ANALITYK’; 
 
/* Krok 2 – policzenie analitykow w kazdym dziale */ 
INSERT INTO DZIAŁ_ANALIT (NUMDZ, ILE_ANALIT)  
SELECT NUMDZ, COUNT(NUMP) FROM PRAC  
WHERE STANOWISKO=’ANALITYK’ GROUP BY NUMDZ 
 
/* Krok 3 – wyszukanie kierowników */ 
SELECT PRAC.NUMP, PRAC.NAZWP, PRAC.STANOWISKO 
FROM PRAC, DZIAŁ_ANALIT, ANALITYK_SR_ZAROB 
WHERE PRAC.STANOWISKO=’KIEROWNIK’ AND  
PRAC.NUMDZ=ANALITYK_SR_ZAROB.NUMDZ AND ANALITYK_SR_ZAROB.ILE_ANALIT 
= 0 AND 
PRAC.ZAROB > ANALITYK_SR_ZAROB.SR_ZAROB 

 
h)

 

Wyświetli listę zarówno tych pracowników, którzy dostają premię, jak i tych, którzy 
mają pensje powyŜej średniej. 

 
/* Krok 1 – wyliczenie 

ś

redniej pensji */ 

INSERT INTO PRAC_SR_ZAROB (SR_ZAROB) SELECT AVG(ZAROB) FROM PRAC; 
 
/* Krok 2 – wyszukanie pracowników */ 
SELECT PRAC.NUMP, PRAC.NAZWP, PRAC.STANOWISKO 
FROM PRAC, PREMIE, PRAC_SR_ZAROB 
WHERE PREMIE.PROW > 0 OR PRAC.ZAROB > PRAC_SR_ZAROB.SR_ZAROB; 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

Poprawne opracowanie zadania z normalizacją