Probleme de SQL – partea II
(recapitulare SQL la anul 3 Calculatoare)
Se dă baza de date relaţională
SECTIE [cods, dens, adrs, sefs]
ATELIER [coda, dena, profil, cods, sefa]
FUNCTIE [codf, denf, salmin, salmax]
PERS [marca, nume, pren, gen, adr, codf, coda]
BENEF [codb, denb, adrb]
LUCRARE [codl, datal, titlu, termen, data_fin, codb]
PONTAJ [marca, codl, data, operatie, ore]
Obs:
Coloanele subliniate sunt chei primare; coloanele italic sunt
chei străine; coloanele sefs si sefa sunt chei străine, ce
corespund mărcii unor persoane, care sunt şefi.
Coloana gen are una din valorile 'm','f'.
Coloana data_fin este completată în momentul finalizării
lucrării; până atunci ea este NULL.
A. Exprimaţi în SQL interogările ce răspund la următoarele
întrebări:
1. Să se afişeze numele, funcţia şi secţia fiecărui angajat,
acordând la feminin denumirea funcţiei.
2. Să se afişeze titlul fiecărei lucrări, denumirea
beneficiarului, termenul de realizare, precum şi un text care
să arate dacă lucrarea este finalizată sau nu.
3. Să se afişeze toţi angajaţii, cu toate operaţiile pe care le-
au executat şi toate lucrările (incluzând şi persoanele care nu
au lucrat nimic şi lucrările la care nu s-a lucrat nimic)
B. Exprimaţi în SQL următoarele prelucrări:
1. Prelungiţi cu 60 zile termenul de realizare a lucrărilor pentru
Sidex
2. Prelungiţi cu 60 zile termenul de realizare a lucrărilor pentru
Sidex şi pentru Damen
3. Prelungiţi cu 60 zile termenul de realizare a ultimei lucrări
contractate.
4. Şeful atelierului Automatizări devine şi şeful secţiei Electric
5. Angajatul cu cele mai multe ore de CTC (operaţie) efectuate,
devine şeful secţiei CTC.
6. Angajaţii cu mai mult de 1000 ore de proiectare (operaţie)
efectuate în luna trecută, este trecut pe funcţia de
proiectant.
7. Ştergeţi atelierele fără angajaţi şi secţiile fără ateliere.
8. Ştergeţi lucrările finalizate inclusiv anul trecut.
9. Ştergeţi lucrările nefinalizate, care aveau termenul de
realizare inclusiv anul trecut.
10. Toate operaţiile care s-au efectuat ieri, s-au repetat şi
astăzi. În consecinţă, să se încarce în tabela PONTAJ toate
operaţiile efectuate astăzi, împreună cu data corespunzătoare.
C. Găsiţi greşelile la următoarele interogări:
1. SELECT adr FROM Pers WHERE nume=Soare , pren=Petrica;
2. SELECT adr FROM Pers WHERE marca=(SELECT sefs FROM Sectie);
3. SELECT operatie FROM Pontaj WHERE data=2008;
4. SELECT operatie FROM Pontaj WHERE data='2008';
5. SELECT COUNT(*), data FROM Pontaj WHERE data=SYSDATE;
6. SELECT SUM(denb) FROM Benef WHERE adrb='Tecuci';
7. SELECT nume FROM Pers
WHERE codf IN (SELECT * FROM Functie WHERE
denf='zugrav');
8. SELECT 'marca', SUM(ore) FROM Pers;
9. SELECT nume FROM Pers, Pontaj WHERE operatie='CTC';
10. SELECT SUM(ore), nume, pren FROM Pers, Pontaj
WHERE [Link]=[Link]
GROUP BY [Link];
11. SELECT nume FROM Pers
WHERE (SELECT codf FROM Functie WHERE denf='inginer');
12. SELECT nume, pren FROM Pers, Pontaj
WHERE [Link]=[Link] HAVING SUM(ore)>1000;
13. DELETE nume FROM Pers
WHERE codf IN (SELECT codf FROM Functie where
denf='portar');
D. Exprimaţi întrebarea la care răspunde fiecare din interogările
următoare:
1. SELECT Nume,Pren FROM Pers
WHERE marca IN (SELECT sefa FROM Atelier);
2. SELECT Nume, Pren FROM Pers
WHERE Marca IN (SELECT Marca FROM Pontaj WHERE data=SYSDATE);
3. SELECT COUNT(ore) FROM Pontaj
WHERE Marca IN (SELECT Marca FROM Pers
WHERE Nume='Ionescu' AND Pren='Georgica');
4. SELECT COUNT(DISTINCT codl) FROM Pontaj
WHERE Marca IN (SELECT Marca FROM Pers
WHERE Nume='Ionescu' AND Pren='Georgica');
5. SELECT SUM(ore) FROM Pontaj
WHERE Marca NOT IN (SELECT Marca FROM Pers
WHERE Nume='Ionescu' AND Pren='Georgica');