Zapytania SQL rozwiązane

advertisement
I.
ZAPYTANIA SQL
1.
Wybrać numery departamentów, nazwiska pracowników oraz numery pracownicze ich
szefów z tabeli EMP.
SELECT ename, deptno, mgr
FROM emp;
2.
Wybrać wszystkie kolumny z tabeli emp;
SELECT *
FROM emp;
3.
Wyliczyć roczną pensje podstawową dla każdego pracownika.
SELECT ename, sal * 12
FROM emp;
4.
Wyliczyć roczną pensje podstawową dla każdego pracownika, gdyby każdy dostał
podwyżkę o 250.
SELECT ename, (sal + 250) * 12
FROM emp;
5.
Wybrane wyrażenie SAL*12 zaetykietować nagłówkiem ROCZNA.
SELECT ename, sal*12 AS roczna
FROM emp;
6.
Wybrane wyrażenie SAL*12 zaetykietować nagłówkiem R PENSJA.
SELECT ename, sal*12 AS ”r pensja”
FROM emp;
Jeżeli chcemy użyć spacji w etykiecie kolumny, to używamy cudzysłowu ”, natomiast
w wartościach typu tekstowego używamy apostrofu ‘.
7.
Połączyć EMPNO i nazwisko, opatrzyć je nagłówkiem EMPLOYEE.
SELECT empno || ename AS employee
FROM emp;
W MS SQL istnieje konieczność konwertowania wartości numerycznych do
tekstowych (w Oracle nie). Operatorem konkatenacji jest w tym wypadku + a nie ||
SELECT CONVERT(VARCHAR, empno) + ename AS employee
FROM emp;
8.
Utworzyć zapytanie zwracające wynik w postaci np. „Kowalski pracuje w dziale 20”.
SELECT ename || ‘ pracuje w dziale nr ' || deptno
FROM emp;
MS SQL:
SELECT ename + ‘ pracuje w dziale nr ' + CONVERT(VARCHAR,deptno)
FROM emp;
9.
Wyliczyć roczną pensję całkowitą dla każdego pracownika.
SELECT ename, (sal * 12 + NVL(comm,0))
FROM emp;
Użycie funkcji NVL jest niezbędne, gdyż kolumna comm u niektórych pracowników
zawiera wartość NULL. Wykonywanie operacji arytmetycznych na wartości NULL
daje również NULL np. 2 + NULL = NULL, natomiast 2 + NVL(NULL, 0) = 2.
W MS SQL odpowiednikiem funkcji NVL jest ISNULL:
SELECT ename, (sal * 12 + ISNULL(comm,0))
FROM emp;
10.
Wyświetlić wszystkie numery departamentów występujące w tabeli EMP.
SELECT deptno
FROM Emp;
11.
Wyświetlić wszystkie różne numery departamentów występujące w tabeli EMP.
SELECT DISTINCT deptno
FROM Emp;
12.
Wybrać wszystkie wzajemnie różne kombinacje wartości DEPTNO i JOB.
SELECT DISTINCT deptno, job
FROM Emp;
13.
Posortować wszystkie dane tabeli EMP według ENAME.
SELECT *
FROM emp
ORDER BY ename;
14.
Posortować malejąco wszystkie dane tabeli EMP według daty zatrudnienia począwszy
od ostatnio zatrudnionych.
SELECT * FROM emp ORDER BY hiredate DESC;
15.
Posortować dane tabeli EMP według wzrastających wartości kolumn DEPTNO oraz
malejących wartości kolumny SAL (bez wypisywania kolumny SAL).
SELECT empno, ename, job, mgr
FROM emp
ORDER BY deptno, sal DESC;
Domyślnie przyjęty jest porządek rosnący i dlatego nie musimy pisać ASC po deptno.
16.
Wybrać nazwiska, stanowiska pracy, płacę i numery departamentów wszystkich
zatrudnionych na stanowisku CLERK.
SELECT ename, job, sal, deptno FROM emp
WHERE job = 'CLERK';
17.
Wybrać wszystkie nazwy i numery departamentów o numerze większym od 20.
SELECT deptno, dname
FROM dept
WHERE deptno > 20;
18.
Wybrać pracowników, których prowizja przekracza miesięczną pensję.
SELECT *
FROM emp
WHERE NVL(comm,0) > sal;
MS SQL:
SELECT *
FROM emp
WHERE ISNULL(comm,0) > sal;
19.
Wybrać dane tych pracowników, których zarobki mieszczą się pomiędzy 1000 a 2000.
SELECT *
FROM emp
WHERE sal BETWEEN 1000 AND 2000;
20.
Wybrać dane pracowników, których bezpośrednimi szefami są 7902, 7566 lub 7788.
SELECT *
FROM emp
WHERE mgr IN (7902, 7566, 7788);
Rozwiązanie bez użycia IN:
SELECT * FROM emp WHERE mgr = 7902 OR mgr = 7566 OR mgr = 7788;
21.
Wybrać dane tych pracowników, których nazwiska zaczynają się na S.
SELECT *
FROM emp
WHERE ename LIKE 'S%';
22.
Wybrać dane tych pracowników, których nazwiska są czteroliterowe.
SELECT *
FROM emp
WHERE LENGTH(ename) = 4;
Inne rozwiązanie:
SELECT *
FROM emp
WHERE ename LIKE ‘____’
MS SQL:
SELECT *
FROM emp
WHERE LEN(ename) = 4;
23.
Wybrać dane tych pracowników, którzy nie posiadają szefa.
SELECT *
FROM emp
WHERE mgr IS NULL;
24.
Wybrać dane tych pracowników, których zarobki są poza przedziałem <1000, 2000>.
SELECT *
FROM emp
WHERE NOT sal BETWEEN 1000 AND 2000;
Rozwiązanie bez użycia BETWEEN:
SELECT * FROM emp
WHERE sal < 1000 OR sal > 2000;
25.
Wybrać dane tych pracowników, których nazwiska nie zaczynają się na M.
SELECT *
FROM emp
WHERE NOT ename LIKE 'M%';
26.
Wybrać dane tych pracowników, którzy mają szefa.
SELECT *
FROM emp
WHERE mgr IS NOT NULL;
27.
Wybrać dane tych pracowników zatrudnionych na stanowisku CLERK, których
zarobki mieszczą się w przedziale <1000, 2000).
SELECT *
FROM emp
WHERE job = 'CLERK' AND sal >= 1000 AND sal < 2000;
28.
Wybrać dane pracowników albo zatrudnionych na stanowisku CLERK, albo tych,
których zarobki mieszczą się w przedziale <1000, 2000).
SELECT *
FROM emp
WHERE job = 'CLERK' OR (sal >= 1000 AND sal < 2000);
29.
Wybrać wszystkich pracowników zatrudnionych na stanowisku MANAGER z pensją
powyżej 1500 oraz wszystkich na stanowisku SALESMAN.
SELECT *
FROM emp
WHERE (sal > 1500 AND job = 'MANAGER') OR job = 'SALESMAN';
30.
Wybrać wszystkich pracowników zatrudnionych na stanowisku MANAGER lub na
stanowisku SALESMAN z pensją powyżej 1500.
SELECT *
FROM emp
WHERE job = 'MANAGER' OR (job = 'SALESMAN' AND sal >1500);
31.
Wybrać wszystkich pracowników zatrudnionych na stanowisku MANAGER ze
wszystkich departamentów wraz ze wszystkimi pracownikami zatrudnionymi na
stanowisku CLERK w departamencie 10.
SELECT *
FROM emp
WHERE job = ‘MANAGER’ OR (job = ‘CLERK’ AND deptno = 10)
32.
Wybrać wszystkie dane z tabeli SALGRADE.
SELECT *
FROM salgrade
33.
Wybrać wszystkie dane z tabeli DEPT
SELECT *
FROM dept
34.
Wybrać dane tych pracowników, których zarobki mieszczą się w przedziale
<1000,2000>
SELECT *
FROM emp
WHERE sal BETWEEN 1000 AND 2000
35.
Wybrać numery i nazwy departamentów sortując według numerów departamentów
SELECT deptno, dname
FROM dept
ORDER BY deptno
36.
Wybrać wszystkie wzajemnie różne stanowiska pracy
SELECT DISTINCT job
FROM emp
37.
Wybrać dane pracowników zatrudnionych w departamentach 10 i 20 w kolejności
alfabetycznej ich nazwisk
SELECT *
FROM emp
WHERE deptno = 10 OR deptno = 20
ORDER BY ename
38.
Wybrać nazwiska i stanowiska pracy wszystkich pracowników z departamentu 20
zatrudnionych na stanowisku CLERK
SELECT ename, job
FROM emp
WHERE deptno = 20 AND job = ‘CLERK’
39.
Wybrać nazwiska tych pracowników, w których nazwisku występuje ciąg „TH” lub
„LL”
SELECT ename
FROM emp
WHERE ename LIKE ‘%TH%’ OR ename LIKE ‘%LL%’
40.
Wybrać nazwisko, stanowisko i pensję pracowników, którzy posiadają szefa
SELECT ename, job, sal
FROM emp
WHERE mgr IS NOT NULL
41.
Wybrać nazwiska i całkowite roczne zarobki wszystkich pracowników
SELECT ename, sal*12 + NVL(comm, 0)
FROM emp
MS SQL
SELECT ename, sal*12 + ISNULL(comm, 0)
FROM emp
42.
Wybrać ENAME, DEPTNO i HIREDATE tych pracowników, którzy zostali
zatrudnieni w 1980r.
SELECT ename, deptno, hiredate
FROM emp
WHERE hiredate >= ‘01/01/80’ AND hiredate <= ‘31/12/80’
Format daty może zależeć od ustawień serwera. Warto wcześniej sprawdzić, jaki
format jest ustawiony na serwerze lub użyć funkcji konwertujących / porównujących
daty.
43.
Wybrać nazwiska, roczna pensję oraz prowizję tych wszystkich sprzedawców, których
miesięczna pensja przekracza prowizję. Wyniki posortować według malejących
zarobków, potem nazwisk
SELECT ename, sal * 12, comm
FROM emp
WHERE sal > NVL(comm,0)
ORDER BY sal DESC, ename
MS SQL
SELECT ename, sal * 12, comm
FROM emp
WHERE sal > ISNULL(comm,0)
ORDER BY sal DESC, ename
WYBIERANIE DANYCH Z WIELU TABEL
1.
Połącz dane z tabeli EMP i DEPT przy pomocy warunku złączenia w WHERE.
SELECT *
FROM emp, dept
WHERE emp.deptno = dept.deptno;
Gdyby nie było warunku złączenia (WHERE emp.deptno = dept.deptno), to każdy
pracownik zostałby wypisany kilkakrotnie, połączony z każdym działem.
2.
Połącz dane z tabeli EMP i DEPT przy pomocy INNER JOIN.
SELECT *
FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;
To zapytanie zadziała dokładnie tak samo jak to z punktu 1. Różnica jest taka, że przy
pomocy INNER JOIN możemy oddzielić warunki złączenia od pozostałych
warunków.
3.
Wybierz nazwiska oraz nazwy departamentów wszystkich pracowników w kolejności
alfabetycznej.
SELECT ename, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno ORDER BY ename
4.
Wybierz nazwiska wszystkich pracowników wraz z numerami i nazwami
departamentów w których są zatrudnieni.
SELECT ename, dname, emp.deptno
FROM emp, dept
WHERE emp.deptno = dept.deptno;
Wybierając numery departamentów musimy określić, z której tabeli mają być one
wybrane (emp.deptno), ponieważ kolumna deptno występuje zarówno w tabeli emp
jak i w dept. Wszystko jedno, z której tabeli wybierzemy, ponieważ jak określa
warunek WHERE, numery te są sobie równe.
5.
Dla pracowników o miesięcznej pensji powyżej 1500 podaj ich nazwiska, miejsca
usytuowania ich departamentów oraz nazwy tych departamentów.
SELECT ename, loc, dname
FROM emp, dept
WHERE sal > 1500 AND emp.deptno = dept.deptno;
6.
Utwórz listę pracowników podając ich nazwisko, zawód, pensję i stopień
zaszeregowania.
SELECT ename, job, sal, grade
FROM emp, salgrade
WHERE sal BETWEEN losal AND hisal;
W tym zapytaniu mamy do czynienia ze złączeniem nie po kluczach (klucz główny =
klucz obcy) tylko po wartościach atrybutów.
7.
Wybierz informacje o pracownikach, których zarobki odpowiadają klasie 3.
SELECT ename, sal, job
FROM emp, salgrade
WHERE sal BETWEEN losal AND hisal AND grade = 3;
8.
Wybierz pracowników zatrudnionych w Dallas.
SELECT ename, loc
FROM emp, dept
WHERE emp.deptno = dept.deptno AND loc = ‘DALLAS’
9.
Wybierz nazwiska pracowników, nazwy działów i stopnie zaszeregowania
SELECT ename, dname, grade
FROM emp
INNER JOIN dept ON emp.deptno = dept.deptno
INNER JOIN salgrade ON sal BETWEEN losal AND hisal
Oczywiście równie dobre byłoby rozwiązanie bez użycia INNER JOIN (z warunkami
złączenia w WHERE).
10.
Wypisz dane wszystkich działów oraz ich pracowników tak, aby dane działu pojawiły
się, nawet jeśli nie ma w dziale żadnego pracownika.
SELECT *
FROM dept
LEFT JOIN emp ON emp.deptno = dept.deptno;
LEFT JOIN określa, że warunek złączenia może, ale nie musi być spełniony aby
rekord z tabeli dept został wyświetlony. Jeżeli warunek nie jest spełniony (np. dla
działu 40 w którym nikt nie pracuje), wyświetlą się dane działu, a pozostałe pola (te z
tabeli emp) będą ustawione na NULL.
11.
Wybierz pracowników z działu 20 i 30 (nazwisko i nr działu – wypisz dział 40 bez
nazwisk).
SELECT ename, deptno FROM emp WHERE deptno = 20
UNION SELECT ‘’, deptno FROM emp WHERE deptno = 30;
Dwa apostrofy w drugim zapytaniu są potrzebne, ponieważ obydwa zapytania w unii
muszą mieć tyle samo pól (pola muszą sobie odpowiadać).
Możemy jednak zauważyć, że wypisał się tylko jeden pracownik z działu 30, a z
pewnością jest ich więcej. Jest to spowodowane tym, że UNION usuwa duplikaty
podobnie do DISTINCT, więc wszystkie rekordy (‘’, 30) zostają zbite w jeden rekord.
Aby pozbyć się tego problemu, musimy dodać jakieś pole, które rozróżni rekordy, np.
empno lub użyć UNION ALL.
SELECT ename, deptno, empno FROM emp WHERE deptno = 20
UNION SELECT ‘’, deptno, empno FROM emp WHERE deptno = 30;
12.
Wypisz stanowiska występujące w dziale 10 oraz 30.
SELECT job FROM emp WHERE deptno = 10
UNION SELECT job FROM emp WHERE deptno = 30;
Oczywiście można to też zrobić bez użycia UNION np.:
SELECT DISTINCT job FROM emp
WHERE deptno IN (10, 30);
13.
Wypisz stanowiska występujące zarówno w dziale 10 jak w dziale 30.
SELECT job FROM emp WHERE deptno = 10
INTERSECT SELECT job FROM emp WHERE deptno = 30;
INTERSECT nie występuje w standardzie SQL i nie zadziała również w MS SQL.
Aby rozwiązać to zadanie bez INTERSECT, należałoby użyć podzapytań (omówione
w dziale 4).
14.
Wypisz stanowiska występujące w dziale 10 a nie występujące w dziale 30.
SELECT job FROM emp WHERE deptno = 10
MINUS SELECT job FROM emp WHERE deptno = 30;
MINUS nie występuje w standardzie SQL i nie zadziała również w MS SQL. Aby
rozwiązać to zadanie bez MINUS, należałoby użyć podzapytań (omówione w dziale
4).
15.
Wybierz pracowników, którzy zarabiają mniej od swoich kierowników.
SELECT pracownik.ename, pracownik.sal
FROM emp pracownik, emp kierownik
WHERE pracownik.mgr = kierownik.empno AND pracownik.sal < kierownik.sal
W tym zapytaniu musimy złączyć tabelę emp z samą sobą (mgr jest kluczem obcym z
tabeli emp i wskazuje kierownika). Musimy więc użyć dwukrotnie tabeli emp po
FROM. Aby wiedzieć, do której z tabel emp się odwołujemy, musimy nadać aliasy
(pracownik i kierownik) a następnie odwoływać się do nich tak, jakby były to
normalne tabele.
16.
Dla każdego pracownika wypisz jego nazwisko oraz nazwisko jego szefa. Posortuj
według nazwiska szefa.
SELECT pracownik.ename, kierownik.ename
FROM emp pracownik, emp kierownik
WHERE pracownik.mgr = kierownik.empno
ORDER BY kierownik.ename
III. FUNKCJE GRUPUJĄCE
1. Oblicz średni zarobek w firmie.
SELECT AVG(sal)
FROM emp;
2. Znajdź minimalne zarobki na stanowisku CLERK.
SELECT MIN(sal)
FROM emp
WHERE job = ‘CLERK’
3. Znajdź ilu pracowników zatrudniono w departamencie 20.
SELECT COUNT(*)
FROM emp
WHERE deptno = 20;
4. Obliczyć średnie zarobki na każdym ze stanowisk pracy.
SELECT job, AVG(sal)
FROM emp
GROUP BY job;
5. Obliczyć średnie zarobki na każdym ze stanowisk pracy z wyjątkiem stanowiska
MANAGER.
SELECT job, AVG(sal)
FROM emp
WHERE NOT job = ‘MANAGER’
GROUP BY job;
6. Obliczyć średnie zarobki na każdym ze stanowisk pracy w każdym departamencie.
SELECT deptno, job, AVG(sal)
FROM emp
GROUP BY deptno, job;
7. Dla każdego stanowiska oblicz maksymalne zarobki.
SELECT MAX(sal), job
FROM emp
GROUP BY job;
8. Wybrać średnie zarobki tylko tych departamentów, które zatrudniają więcej niż trzech
pracowników.
SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno
HAVING COUNT(*) > 3;
9. Wybrać tylko te stanowiska, na których średni zarobek wynosi 3000 lub więcej.
SELECT job, AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal) >= 3000;
------------------------------------------------------------------------------------------------------------10. Znajdź średnie miesięczne pensje oraz średnie roczne zarobki dla każdego stanowiska,
pamiętaj o prowizji.
SELECT AVG(sal), AVG(sal*12 + NVL(comm,0))
FROM emp
GROUP BY job;
MS SQL
SELECT AVG(sal), AVG(sal*12 + ISNULL(comm,0))
FROM emp
GROUP BY job;
11. Znajdź różnicę miedzy najwyższą i najniższa pensją.
SELECT MAX(sal) - MIN(sal)
FROM emp
12. Znajdź departamenty zatrudniające powyżej trzech pracowników.
SELECT deptno, COUNT(*)
FROM emp
GROUP BY deptno
HAVING COUNT (*) > 3;
13. Sprawdź, czy wszystkie numery pracowników są rzeczywiście wzajemnie różne.
SELECT MAX(COUNT(*))
FROM emp
GROUP BY empno;
Aby sprawdzić, czy numery empno są rzeczywiście wzajemnie różne, grupujemy po nich
i liczymy ile jest rekordów w każdej grupie. Następnie bierzemy maksimum z tych
numerów. Jeżeli jest 1 to ok., jeżeli np. 2 to znaczy, że istnieje 2 pracowników o takim
samym numerze.
14. Podaj najniższe pensje wypłacane podwładnym swoich kierowników. Wyeliminuj grupy o
minimalnych zarobkach niższych niż 1000. Uporządkuj według pensji.
SELECT mgr, MIN(sal) AS najnizsza
FROM emp
GROUP BY mgr
HAVING MIN(sal) > 1000
ORDER BY najnizsza;
------------------------------------------------------------------------------------------------------------15. Wypisz ilu pracowników ma dział mający siedzibę w DALLAS.
SELECT COUNT(*)
FROM emp, dept
WHERE dept.loc = ‘DALLAS’ AND emp.deptno = dept.deptno;
16. Podaj maksymalne zarobki dla każdej klasy zarobkowej.
SELECT MAX(sal), grade
FROM emp, salgrade
WHERE sal BETWEEN losal AND hisal
GROUP BY grade;
17. Sprawdź, które wartości zarobków powtarzają się.
SELECT sal, COUNT(*)
FROM emp
GROUP BY sal
HAVING COUNT(*) > 1;
18. Podaj średni zarobek pracowników z drugiej klasy zarobkowej.
SELECT AVG(sal)
FROM emp, salgrade
WHERE grade = 2 AND sal BETWEEN losal AND hisal;
19. Sprawdź, ilu podwładnych ma każdy kierownik.
SELECT mgr, COUNT(*)
FROM emp
GROUP BY mgr;
20. Podaj sumę, którą zarabiają razem wszyscy pracownicy z pierwszej klasy zarobkowej.
SELECT SUM(sal)
FROM emp, salgrade
WHERE sal BETWEEN losal AND hisal AND grade = 1;
IV. PODZAPYTANIA
1. Znaleźć pracowników z pensją równą minimalnemu zarobkowi w firmie.
SELECT *
FROM emp
WHERE sal = (SELECT MIN(sal) FROM emp);
2. Znaleźć wszystkich pracowników zatrudnionych na tym samym stanowisku co BLAKE.
SELECT *
FROM emp
WHERE job = (SELECT job FROM emp WHERE ename = ‘BLAKE’);
3. Znaleźć pracowników o pensjach z listy najniższych zarobków osiągalnych w
departamentach.
SELECT *
FROM emp
WHERE sal IN (SELECT MIN(sal) FROM emp GROUP BY dept);
4. Znaleźć pracowników o najniższych zarobkach w ich departamentach.
SELECT *
FROM emp a
WHERE sal = (SELECT MIN(sal) FROM emp b WHERE a.deptno = b.deptno);
5. Stosując operator ANY wybrać pracowników zarabiających powyżej najniższego zarobku
z departamentu 30.
SELECT *
FROM emp
WHERE sal > ANY (SELECT sal FROM emp WHERE dept = 30);
6. Znaleźć pracowników, których zarobki są wyższe od pensji każdego pracownika z
departamentu 30.
SELECT *
FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE dept = 30);
7. Wybrać departamenty, których średnie zarobki przekraczają średni zarobek departamentu
30.
SELECT DISTINCT deptno
FROM emp
GROUP BY deptno
HAVING AVG(sal) > (SELECT AVG(sal) FROM emp WHERE deptno = 30);
8. Znaleźć stanowisko, na którym są najwyższe średnie zarobki.
SELECT job
FROM emp
GROUP BY job
HAVING AVG(sal) = (SELECT MAX(AVG(sal)) FROM emp GROUP BY job);
W MS SQL nie można używać MAX(AVG(…)). Możemy jednak to zadanie rozwiązać
inaczej:
SELECT job
FROM emp
GROUP BY job
HAVING AVG(sal) >= ALL (SELECT AVG(sal) FROM emp GROUP BY job);
9. Znaleźć pracowników, których zarobki przekraczają najwyższe pensje z departamentu
SALES.
SELECT *
FROM emp
WHERE sal > (SELECT MAX(sal) FROM emp, dept WHERE emp.deptno =
dept.deptno AND dname = ‘SALES’);
10. Znaleźć pracowników, którzy zarabiają powyżej średniej w ich departamentach.
SELECT *
FROM emp a
WHERE sal > (SELECT AVG(sal) FROM emp b WHERE a.deptno = b.deptno);
11. Znaleźć pracowników, którzy posiadają podwładnych za pomocą operatora EXISTS.
SELECT *
FROM emp a
WHERE EXISTS (SELECT * FROM emp b WHERE b.mgr = a.empno);
12. Znaleźć pracowników, których departament nie występuje w tabeli DEPT.
SELECT *
FROM emp
WHERE deptno NOT IN (SELECT deptno FROM dept);
Wynik ‘No rows selected’ jest normalny, ponieważ w demonstracyjnej bazie (demobld)
nie ma takich pracowników.
------------------------------------------------------------------------------------------------------------13. Wskazać dla każdego departamentu ostatnio zatrudnionych pracowników. Uporządkować
według dat zatrudnienia.
SELECT *
FROM emp a
WHERE hiredate = (SELECT MAX(hiredate) FROM emp b WHERE a.deptno =
b.deptno)
ORDER BY hiredate;
14. Podać ENAME, SAL i DEPTNO dla pracowników, których zarobki przekraczają średnią
ich departamentów.
SELECT ename, sal, deptno
FROM emp a
WHERE sal > (SELECT AVG(sal) FROM emp b WHERE b.deptno = a.deptno);
15. Stosując podzapytanie znaleźć departamenty, w których nikt nie pracuje.
SELECT *
FROM dept
WHERE deptno NOT IN (SELECT deptno FROM emp);
16. Dla każdego stanowiska wypisać maksymalną pensję z dopiskiem „Maksymalna” oraz
minimalną z dopiskiem „Minimalna”. Posortować wynik według stanowiska.
SELECT job, zarobki, minmax FROM
(SELECT job, MAX(sal) AS zarobki, ‘Maksymalna’ AS minmax FROM emp GROUP
BY job
UNION SELECT job, MIN(sal) AS zarobki, ‘Minimalna’ AS minmax FROM emp
GROUP BY job) abc
ORDER BY job;
Zapytania SQL można używać po FROM zamiast tabeli. Trzeba wtedy nadać takiemu
podzapytaniu alias (w tym wypadku abc).
17. Napisz zapytanie zwracające procentowy udział liczby pracowników w każdym dziale.
SELECT deptno, w_dziale / razem * 100
FROM (SELECT COUNT(*) AS razem FROM emp) a,
(SELECT deptno, COUNT(*) AS w_dziale FROM emp GROUP BY deptno) b
W MS SQL istnieje konieczność konwersji wyniku do typu zmiennopozycyjnego,
ponieważ COUNT zwraca typ INT, a wynik dzielenia INT / INT jest również typu INT.
Download