Facebook
From Oliwer, 3 Years ago, written in SQL.
Embed
Download Paste or View Raw
Hits: 59
  1. -- 1. SELECT
  2. SELECT ename, sal FROM scott.emp;
  3. SELECT * FROM scott.emp;
  4. SELECT ename, sal, comm, sal+comm FROM scott.emp;
  5. SELECT ename, sal, comm, NVL(comm,0), sal+comm, sal+NVL(comm,0) FROM scott.emp;
  6. SELECT ename, sal AS pensja, comm, NVL(comm,0), sal+comm, sal+NVL(comm,0) wynagr FROM scott.emp;
  7. SELECT job, deptno FROM scott.emp;
  8. SELECT DISTINCT job, deptno FROM scott.emp;
  9. SELECT DISTINCT job, deptno FROM scott.emp;
  10. SELECT ename, sal, deptno FROM scott.emp ORDER BY sal DESC, ename;
  11.  
  12. -- 1. SELECT [DISTINCT|ALL] * | nazwa_kol_1 [[AS] alias1], [,...,nazwa_kol_N [[AS] aliasN] FROM nazwa_tabeli
  13. --    [ORDER BY nazwa_kol_1 [ASC|DESC], ....];
  14.  
  15. -- 2. CREATE TABLE nazwa_tabeli AS SELECT .....;
  16. CREATE TABLE emp AS SELECT * FROM scott.emp;
  17.  
  18. SELECT * FROM emp;
  19.  
  20. -- Typy danych: INT(n), CHAR(n), NUMBER(m,n), NUMBER(m) (NUMBER(5,2), NUMBER(5)), VARCHAR2(n), DATE
  21. -- Modyfikatory ograniczeń NOT NULL, UNIQUE, PRIMARY KEY, DEFAULT wartość
  22. -- 2. CREATE TABLE nazwa_tabeli (
  23. --     nazwa_kol_1 TYP_KOL_1 [modyfikatory],
  24. --     nazwa_kol_2 TYP_KOL_2 [modyfikatory],
  25. --     ....
  26. --     nazwa_kol_N TYP_KOL_N [modyfikatory]
  27. --);
  28. -- 2. CREATE TABLE nazwa_tabeli (
  29. --     nazwa_kol_1 TYP_KOL_1 NOT NULL | UNIQUE | PRIMARY KEY | DEFAULT wartość
  30. --     nazwa_kol_2 TYP_KOL_2 NOT NULL | UNIQUE | PRIMARY KEY | DEFAULT wartość
  31. --     ....
  32. --     nazwa_kol_N TYP_KOL_N NOT NULL | UNIQUE | PRIMARY KEY | DEFAULT wartość
  33. --);
  34. -- 3. DROP TABLE nazwa_tabeli [PURGE];
  35. CREATE TABLE dane_os (
  36.     pesel NUMBER(11) PRIMARY KEY,
  37.     nazwisko VARCHAR2(40) NOT NULL,
  38.     data_ur DATE,
  39.     plec CHAR(1) DEFAULT 'K',
  40.     stypendium NUMBER(6,2) UNIQUE
  41. );
  42.  
  43. SELECT nazwisko, stypendium, 3.7+0.1 FROM dane_os;
  44.  
  45. -- 4. INSERT INTO nazwa_tabeli [(nazwa_kol_1, ..., nazwa_kol_N)] VALUES (wart_kol_1, ..., wart_kol_N);
  46.  
  47. INSERT INTO dane_os (NAZWISKO, PESEL, PLEC, STYPENDIUM) VALUES ('Lewandowska', 3, 'K', 299.99);
  48. INSERT INTO dane_os (PESEL, NAZWISKO, data_ur, STYPENDIUM) VALUES (4, 'Piotrowska', '2000-01-01', 299.98);
  49. INSERT INTO dane_os VALUES (5, 'Jankowski', '1992-12-31', 'M', 1.98);
  50.  
  51. CREATE TABLE dane_os2 AS SELECT pesel, nazwisko, data_ur FROM dane_os;
  52.  
  53. SELECT * FROM tab;
  54. DROP TABLE dane_os2;
  55. PURGE recyclebin;
  56.  
  57. -- 4. INSERT INTO nazwa_tabeli [(nazwa_kol_1, ..., nazwa_kol_N)] SELECT ... ;
  58.  
  59. -- wartości logiczne: true, false, null
  60. -- klauzula WHERE
  61. -- WHERE w-ek
  62.  
  63. SELECT * FROM emp WHERE deptno=10;
  64.  
  65.  
  66. -- 4. klauzula WHERE
  67. -- WHERE w-ek
  68.  
  69. SELECT * FROM emp
  70. WHERE deptno=10
  71. ORDER BY ename;
  72.  
  73. SELECT ename, sal, comm, deptno FROM emp
  74. WHERE (NVL(comm,0) <> 300) AND (sal > 1300);
  75.  
  76. -- w-ek: nazwy kolumn, stale, funkcje (wbudowane, wlasne), procedury (wbudowane, wlasne), nawiasy
  77. -- operatory:
  78. -- arytmetyczne: + - / *
  79. -- równości i porównania: =  >  <  >=  <=  <>  !=
  80. -- logiczne: AND,  OR,  NOT
  81. -- konkatenacji lancuchów: ||
  82. -- inne występujace w wyrażeniach logicznych: IS NULL, IS NOT NULL, BETWEEN wyr1 AND wyr2, LIKE wzorzec
  83. -- IN (lista), NOT IN (lista)
  84.  
  85. SELECT * FROM emp WHERE comm IS NULL;
  86. SELECT * FROM emp WHERE NOT comm IS NULL;
  87. SELECT * FROM emp WHERE comm IS NOT NULL;
  88.  
  89. SELECT * FROM emp WHERE comm IS NULL OR comm=0;
  90. SELECT 'Pracownik ' || ename || ' zarabia '|| sal Raport FROM emp;
  91.  
  92. -- wzorzec, metaznaki: % _
  93. SELECT * FROM emp WHERE ename LIKE 'SMITH';
  94. SELECT * FROM emp WHERE ename='SMITH';
  95. SELECT * FROM emp WHERE ename LIKE '%M%';
  96. SELECT * FROM emp WHERE ename LIKE 'KOWALSK_';
  97. SELECT * FROM emp WHERE ename='KOWALSKI' OR ename='KOWALSKA';
  98.  
  99.  
  100. SELECT * FROM emp WHERE deptno IN (10,20);
  101. SELECT * FROM emp WHERE deptno=10 OR deptno=20;
  102. SELECT * FROM emp WHERE deptno NOT IN (10,20);
  103. SELECT * FROM emp WHERE NOT deptno IN (10,20);
  104. SELECT * FROM emp WHERE sal BETWEEN 1250 AND 3000 ORDER BY sal;
  105. -- Zad 1.
  106. -- a) Podaj dane pracowników z oddzialów 20 i 30
  107. SELECT * FROM emp WHERE deptno IN (20,30);
  108. -- b) Podaj dane pracowników zatrudnionych pomiędzy 1 maja 1981 a 4 grudnia 1981
  109. SELECT * FROM emp WHERE hiredate BETWEEN '81/05/01' AND '81/12/04';
  110. -- c) Podaj nazwiska, pensje i nr oddzialu pracowników, którzy zarabiaja więcej niż 2000 i nie sa zatrudnieni w oddziale 30.
  111. SELECT ename, sal, deptno FROM emp WHERE sal > 2000 AND deptno != 30;
  112. -- d) Podaj dane pracowników nie otrzymujacych premii (comm)
  113. -- 1. SELECT [DISTINCT|ALL] * | nazwa_kol_1 [[AS] alias1], [,...,nazwa_kol_N [[AS] aliasN] FROM nazwa_tabeli
  114. --    [WHERE w-ek]
  115. --    [ORDER BY nazwa_kol_1 [ASC|DESC], ...];
  116.  
  117.  
  118. SELECT COUNT(*) FROM emp;
  119. SELECT sysdate FROM emp;
  120. SELECT * FROM emp;
  121.  
  122. -- Funkcje grupowe: count(), count(*), max(), min(), avg(), sum()
  123. -- GROUP BY nazwa_kol1[, ..., nazwa_kol_N] [HAVING w-ki na grupy]
  124.  
  125. SELECT job, COUNT(*) ilosc_prac, ROUND(avg(sal),2) sr_pensja, MIN(sal),  MAX(sal), SUM(sal) FROM emp
  126. GROUP BY job;
  127. SELECT job, COUNT(*) ilosc_prac, ROUND(avg(sal),2) sr_pensja, MIN(sal),  MAX(sal), SUM(sal) FROM emp
  128. GROUP BY job HAVING (COUNT(*))>2 AND MIN(sal)<2000;
  129.  
  130. -- 1. SELECT [DISTINCT|ALL] * | nazwa_kol_1 [[AS] alias1], [,...,nazwa_kol_N [[AS] aliasN] FROM nazwa_tabeli
  131. --    [WHERE w-ek]
  132. --    [GROUP BY nazwa_kol1[, ..., nazwa_kol_N] [HAVING w-ki na grupy]]
  133. --    [ORDER BY nazwa_kol_1 [ASC|DESC], ....];
  134.  
  135. SELECT job, round(avg(sal),2) FROM emp
  136. GROUP BY job
  137. HAVING job='CLERK';
  138.  
  139. SELECT job, round(avg(sal),2) FROM emp
  140. WHERE job='CLERK'
  141. GROUP BY job;
  142.  
  143. SELECT deptno, avg(sal) FROM emp
  144. GROUP BY deptno;
  145.  
  146. SELECT * FROM emp ORDER BY deptno;
  147.  
  148. SELECT deptno, avg(sal) FROM emp
  149. WHERE ename<>'KING'
  150. GROUP BY deptno;
  151.  
  152. -- Zad. 2
  153. -- a) Dla każdego oddzialu posiadajacego co najmniej 2 pracowników podaj jego nr, liczbę pracowników, średnia pensje
  154. -- oraz rożnicę między pensja maksymalna a minimalna
  155. SELECT deptno, COUNT(*) ilosc, avg(sal) srednia, MAX(sal)-MIN(sal) roznica
  156. FROM emp GROUP BY deptno
  157. HAVING COUNT(*)>=2;
  158. SELECT deptno, COUNT(*) AS ilosc_prac,  avg(sal) pensja, (MAX(sal)-MIN(sal)) roznica FROM emp GROUP BY deptno HAVING COUNT(*)>=2;
  159.  
  160. -- b) Podaj sumę wynagrodzeń (z uwzględnieniem premii) wg oddzialów
  161. -- oddzial, suma_wynagrodzen
  162. SELECT deptno, sal, NVL(comm,0), sal+NVL(comm,0) FROM emp ORDER BY deptno;
  163. SELECT deptno, SUM(sal+NVL(comm,0)) FROM emp GROUP BY deptno;
  164. -- b') Podaj sumę wynagrodzeń (z uwzględnieniem premii) wg stanowisk posortowana alfabetycznie
  165. -- oddzial, suma_wynagrodzen
  166. SELECT job, SUM(sal+NVL(comm,0)) FROM emp GROUP BY job ORDER BY job;
  167. -- c) Dla każdego przelożonego podaj jego nr oraz liczbę jego podwladnych
  168. SELECT COUNT(*), mgr FROM emp
  169. WHERE mgr IS NOT NULL
  170. GROUP BY mgr;
  171. -- 5. DELETE FROM nazwa_tabeli
  172. --    [WHERE w-ek];
  173. DELETE FROM emp WHERE job='CLERK';
  174. SELECT * FROM emp ORDER BY job;
  175. DELETE FROM emp;
  176. INSERT INTO emp SELECT * FROM scott.emp;
  177. -- 6. UPDATE nazwa_tabeli SET nazwa_kol_1=wart_kol_1,[...,nazwa_kol_N=wart_kol_N]
  178. --    [WHERE w-ek];
  179. SELECT ename, sal, job FROM emp WHERE job='ANALYST';
  180. UPDATE emp SET sal=sal/2, job='CLERK' WHERE job='ANALYST';
  181. SELECT ename, sal, job FROM emp WHERE job='CLERK';
  182.  
  183.  
  184. SELECT * FROM TAB;
  185. DESC TAB;
  186. CREATE TABLE dept AS SELECT * FROM scott.dept;
  187. SELECT * FROM dept;
  188. DESC dual;
  189. SELECT * FROM dual;
  190. SELECT sysdate FROM dual;
  191. SELECT sysdate+1 FROM dual;
  192. SELECT sysdate-1 FROM dual;
  193. SELECT sysdate FROM dept;
  194. SELECT 2+2*4 FROM dual;
  195. SELECT '123 a b c' FROM dual;
  196.  
  197. -- TO_CHAR(data, lańcuch_formatujacy)
  198. -- TO_DATE(lańcuch_daty, lańcuch_formatujacy)
  199.  
  200. SELECT TO_CHAR(sysdate, 'YYYY-MM-DD DDD HH24:MI:SS') FROM dual;
  201. SELECT empno, TO_CHAR(hiredate, 'YYYY') FROM emp;
  202. SELECT * FROM dane_os;
  203. SELECT TO_CHAR(data_ur, 'YYYY-MM-DD DDD HH24:MI:SS') FROM dane_os;
  204. SELECT TO_DATE('1999 31 03', 'YYYY DD MM') FROM dual;
  205. SELECT TO_CHAR(TO_DATE('1999 31 03', 'YYYY DD MM'), 'MM') FROM dual;
  206. UPDATE dane_os SET data_ur=TO_DATE('1999 31 03', 'YYYY DD MM') WHERE pesel=3;
  207. UPDATE dane_os SET data_ur='1999-03-31' WHERE pesel=3;
  208. SELECT * FROM dane_os;
  209.  
  210. --Data:
  211.  
  212. -- DD - dzień miesiąca 1-31
  213. -- MM - miesiąc 01-12
  214. -- YYYY - rok 4 cyfrowo
  215. -- DDD - dzień roku 1-366
  216.  
  217. -- Czas:
  218.  
  219. -- HH - godzina 1-12
  220. -- HH24 - godzina 0-23
  221. -- MI - minuty 0-59
  222. -- SS - sekundy 0-59
  223. -- DAY - nazwa dnia tygodnia
  224.  
  225. -- Arytmetyka dat
  226.  
  227. SELECT TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
  228. SELECT TO_CHAR(sysdate-1, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
  229. SELECT TO_CHAR(sysdate+1, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
  230. SELECT TO_CHAR(sysdate+1/24, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
  231. SELECT TO_CHAR(sysdate+1/24/60, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
  232. SELECT TO_CHAR(sysdate+1/24/60/60, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
  233. SELECT (sysdate+1)-sysdate FROM dual;
  234. SELECT TO_CHAR(TO_DATE('2020-09-20', 'YYYY-MM-DD'), 'DDD')-TO_CHAR(TO_DATE('2020-03-10', 'YYYY-MM-DD'), 'DDD') FROM dual;
  235. SELECT sysdate - TO_DATE('1999 31 03', 'YYYY DD MM') FROM dual;
  236.  
  237. -- MONTHS_BETWEEN(data1, data2)
  238. SELECT MONTHS_BETWEEN(sysdate, TO_DATE('1999 31 03', 'YYYY DD MM')) FROM dual;
  239. SELECT ROUND(MONTHS_BETWEEN(sysdate, TO_DATE('1999 31 03', 'YYYY DD MM'))) FROM dual;
  240. SELECT ROUND(MONTHS_BETWEEN(TO_DATE('1999 31 03', 'YYYY DD MM'), sysdate)) FROM dual;
  241.  
  242. -- LAST_DAY(data)
  243. SELECT LAST_DAY(sysdate) FROM dual;
  244. SELECT LAST_DAY('2020-01-01') FROM dual;
  245. SELECT LAST_DAY('2020-02-01') FROM dual;
  246. SELECT TO_CHAR(LAST_DAY('2020-02-01'), 'DAY') FROM dual;
  247.  
  248. -- NEXT_DAY(data, nazwa_dnia_tygodnia)
  249. SELECT NEXT_DAY(sysdate, 'SOBOTA') FROM dual;
  250. SELECT NEXT_DAY(sysdate, 'PONIEDZIAŁEK') FROM dual;
  251. SELECT NEXT_DAY(LAST_DAY('2020-11-01'), 'PIĄTEK') FROM dual;
  252. SELECT NEXT_DAY(LAST_DAY('2020-04-01'), 'PIĄTEK') FROM dual;
  253.  
  254. -- ADD_MONTHS(data, il_mcy)
  255. SELECT sysdate, ADD_MONTHS(sysdate, 2) FROM dual;
  256. SELECT '2020-02-29', ADD_MONTHS('2020-02-29', 1) FROM dual;
  257.  
  258. -- EXTRACT
  259. -- EXTRACT (DAY/MONTH/YEAR FROM data)
  260.  
  261. SELECT EXTRACT(YEAR FROM sysdate) FROM dual;
  262. SELECT EXTRACT(MONTH FROM sysdate) FROM dual;
  263. SELECT EXTRACT(DAY FROM sysdate) FROM dual;
  264.  
  265. -- zaokraglenie do daty
  266.  
  267. SELECT ROUND(sysdate) FROM dual;
  268. SELECT ROUND(sysdate, 'MM') FROM dual;
  269. SELECT ROUND(sysdate, 'YYYY') FROM dual;
  270.  
  271. -- Zad.1
  272. -- a) Wylicz ile dni pozostalo do Świat BN
  273. SELECT ABS(ROUND(sysdate - TO_DATE('2020-12-25', 'yyyy-mm-dd'))) FROM dual;
  274. SELECT ROUND(TO_DATE('2020-12-25','YYYY-MM-DD')-sysdate) FROM dual;
  275. -- b) Wylicz ile godzin żyjesz
  276. SELECT ROUND((sysdate - TO_DATE('2000-02-24', 'YYYY-MM-DD'))*24) FROM dual;
  277.  SELECT (sysdate - TO_DATE('1999-03-25', 'YYYY-MM-DD'))*24 FROM dual;
  278. -- c) Zalóżmy, że szkolenia BHP odbywaja się w każdy pierwszy poniedzialek miesiaca po dacie zatrudnienia. Podaj dla każdego pracownika
  279. -- datę jego szkolenia BHP.
  280. SELECT ename, hiredate, NEXT_DAY(hiredate, 'PONIEDZIAŁEK') FROM emp;
  281. SELECT ename, hiredate, NEXT_DAY(LAST_DAY(hiredate), 'PONIEDZIAŁEK') FROM emp;
  282.  
  283.  
  284. SQL
  285. -- Operacje teorio-mnogościowe: suma (UNION), przekrój (INTERSECT), różnica (MINUS)
  286. SELECT * FROM emp;
  287. SELECT * FROM emp WHERE deptno=10;
  288. SELECT * FROM emp WHERE deptno=20;
  289. SELECT * FROM emp WHERE deptno=10
  290. UNION
  291. SELECT * FROM emp WHERE deptno=20;
  292. -- SELECT * FROM emp WHERE deptno=10 OR deptno=20;
  293. -- SELECT * FROM emp WHERE deptno IN (10,20);
  294. SELECT ename, sal FROM emp WHERE sal >1500
  295. INTERSECT
  296. SELECT ename,  sal FROM emp WHERE sal <3000;
  297. SELECT ename, sal, job FROM emp WHERE sal >1500
  298. MINUS
  299. SELECT ename, sal, job FROM emp WHERE job='MANAGER';
  300. -- Egzaminy(nr-indeksu, kod-p, ocena)
  301. -- Stypendia(nr-indeksu, kwota)
  302. -- [2; 4) 0 zl
  303. -- [4; 4,5] 300 zl
  304. -- (4,5; 5] 500 zl
  305. -- jedno polecenie! wstaw do tabeli Stypendia kazdemu studentowi jego kwote stypendium (pomijajac tych co otrzymaja 0)
  306. -- PODZAPYTANIA (SELECTy użyte wewnatrz innych istrukcji SQL)
  307. -- 1. w klauzuli WHERE
  308. -- CREATE TABLE dept AS SELECT * FROM scott.dept;
  309. SELECT deptno FROM dept WHERE loc='NEW YORK';
  310. SELECT * FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE loc='NEW YORK');
  311. SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc='NEW YORK');
  312. SELECT * FROM emp WHERE deptno NOT IN (SELECT deptno FROM dept WHERE loc='NEW YORK');
  313. -- a) wyrażenie [NOT] IN (SELECT ....)
  314. -- b) wyrażenie operator_porównania [ANY|ALL] (SELECT ...)
  315. SELECT * FROM emp WHERE sal>(SELECT avg(sal) FROM emp);
  316. SELECT * FROM emp WHERE sal>ANY(SELECT sal FROM emp WHERE JOB='MANAGER');
  317. SELECT * FROM emp WHERE deptno=ANY(SELECT deptno FROM dept WHERE loc='NEW YORK');
  318. -- =ANY <=> IN
  319. -- <>ALL <=> NOT IN <=> !=ALL
  320. -- c) [NOT] EXISTS (SELECT ...)
  321. -- Podzapytania skorelowane
  322. -- Podaj dane oddzialów, w których nikt nie pracuje
  323. SELECT * FROM dept WHERE NOT EXISTS(SELECT * FROM emp WHERE deptno=dept.deptno);
  324. SELECT * FROM dept WHERE NOT EXISTS(SELECT * FROM emp WHERE emp.deptno=dept.deptno);
  325. SELECT * FROM dept D WHERE NOT EXISTS(SELECT * FROM emp E WHERE E.deptno=D.deptno);
  326. SELECT * FROM emp E1 WHERE sal>ANY(SELECT sal FROM emp E2 WHERE E1.deptno=E2.deptno);
  327. -- Zad. 1
  328. -- a) Podaj dane pracowników, którzy sa przelożonymi (kogokolwiek)
  329. SELECT * FROM emp WHERE EMPNO=ANY(SELECT MGR FROM emp);
  330. SELECT * FROM emp WHERE empno IN (SELECT mgr FROM emp);
  331. -- b) Podaj nazwisko i pensje pracownikow, którzy zarabiaja więcej niż średnia pensja pracowników w ICH oddziale.
  332. SELECT ename, sal FROM emp e1 WHERE sal > (SELECT avg(sal) FROM emp e2 WHERE e1.deptno = e2.deptno);
  333. -- c) Podaj dane pracowników z oddzialu 20, którzy zarabiaja więcej niż choć jeden pracownik z oddzialu 30.
  334. SELECT * FROM emp WHERE deptno=20 AND sal>ANY(SELECT sal FROM emp WHERE deptno=30);
  335. SELECT * FROM emp WHERE deptno=20 AND sal>ANY(SELECT DISTINCT sal FROM emp WHERE deptno=30);
  336. SELECT * FROM emp WHERE deptno=20 AND sal>ANY(SELECT sal FROM emp WHERE deptno=30 GROUP BY sal);
  337.  
  338.  
  339. -- Podzapytania cd.
  340. SELECT ... FROM ...
  341. WHERE ... (SELECT ...) AND (SELECT ...) OR (SELECT ...)...;
  342. SELECT ... FROM ...
  343. WHERE ... (SELECT ... FROM ... WHERE ...(SELECT ...)...) AND (SELECT ...) OR (SELECT ...)...;
  344. -- 2. Inne miejsca wystepowania podzapytań
  345. INSERT INTO nazwa_tabeli SELECT ...;
  346. CREATE TABLE nazwa_tabeli [(nazw_kol_1,...,nazwa_kol_n)] AS SELECT ...;
  347. -- UPDATE nazwa_tabeli SET nazwa_kol_1=wart_kol_1,[...,nazwa_kol_N=wart_kol_N]
  348. --    [WHERE w-ek];
  349. UPDATE nazwa_tabeli SET nazwa_kol_1=(SELECT ...)[,...]
  350.     [WHERE w-ek];
  351. -- WHERE (ko1, ko2, kol3) IN (SELECT a,b,c FROM ...)
  352. UPDATE emp SET sal=(SELECT avg(sal) FROM emp WHERE deptno=20) WHERE deptno=10;
  353. SELECT ...,(SELECT ... FROM nazwa_tabeli_w ...), ... FROM nazwa_tabeli WHERE ....;
  354. SELECT ename, deptno, sal, (SELECT round(avg(sal)) FROM emp E2 WHERE deptno=E1.deptno) sr_pensja, sal-(SELECT round(avg(sal)) FROM emp E2 WHERE deptno=E1.deptno) roznica FROM emp E1;
  355. SELECT ... FROM (SELECT ... FROM nazwa_tabeli ...) alias_tabeli;
  356. SELECT * FROM emp;
  357. SELECT empno, ename, sal, TO_CHAR(hiredate, 'YYYY') rok_zatr FROM emp;
  358. SELECT rok_zatr, SUM(sal) FROM (SELECT empno, ename, sal, TO_CHAR(hiredate, 'YYYY') rok_zatr FROM emp) emp_n
  359. GROUP BY rok_zatr ORDER BY rok_zatr;
  360. SELECT TO_CHAR(hiredate, 'YYYY') rok_zatr, SUM(sal) rok_zatr FROM emp GROUP BY TO_CHAR(hiredate, 'YYYY') ORDER BY TO_CHAR(hiredate, 'YYYY');
  361. SELECT deptno, COUNT(*) liczba, MIN(sal) minsal, MAX(sal) makssal, MAX(sal)-MIN(sal) r, round(avg(sal)) srednia FROM emp
  362. GROUP BY deptno; -- TABELA T
  363. SELECT ename, (SELECT srednia FROM (SELECT deptno, COUNT(*) liczba, MIN(sal) minsal, MAX(sal) makssal, MAX(sal)-MIN(sal) r, round(avg(sal)) srednia FROM emp
  364. GROUP BY deptno) T WHERE emp.deptno=T.deptno) srednia FROM emp;
  365. SELECT deptno, makssal-minsal rozstep FROM (SELECT deptno, MIN(sal) minsal, MAX(sal) makssal FROM emp
  366. GROUP BY deptno) T;
  367. UPDATE nazwa_tabeli SET .... WHERE ... (SELECT ... ) ...;
  368. DELETE FROM nazwa_tabeli WHERE ...(SELECT ...)...;
  369. DELETE FROM studenci S WHERE EXISTS (SELECT * FROM uwagi U WHERE U.nr_indeksu=S.nr_indeksu);
  370. UPDATE oceny O SET ocena=ocena-1 WHERE EXISTS (SELECT * FROM uwagi U WHERE U.nr_indeksu=O.nr_indeksu);
  371. -- Zad. 1.
  372. -- a) Pracownicy z dzialu 10 otrzymuja średnia pensję sprzedawcy. Zmodyfikuj tabelę.
  373. -- b) Każdy pracownik otrzymuje średnia pensję swojego dzialu. Zmodyfikuj tabelę.
  374.  
  375.  
  376. -- Wybory z wielu tabel
  377.  SELECT ename, deptno, (SELECT loc FROM dept WHERE deptno=emp.deptno) FROM emp;
  378.  -- Zlaczenia (JOINs)
  379.  -- Iloczyny kartezjańskie (CROSS JOIN)
  380.  -- tabela A: A1xA2xA3x...xAn tabela B: B1xB2x...xBm
  381.  -- tabela AxB: A1xA2xA3x...xAxB1xB2x...xBm
  382. SELECT * FROM emp CROSS JOIN dept;
  383. SELECT * FROM emp CROSS JOIN dept WHERE emp.deptno=dept.deptno;
  384. SELECT ename, emp.deptno, loc FROM emp CROSS JOIN dept WHERE emp.deptno=dept.deptno;
  385. -- zlaczenia wewnętrzne/zewnętrzne
  386. -- zl. wewnętrzne: równościowe (equijoins), naturalne (NATURAL), inne
  387. -- SELECT ... FROM tab1 JOIN tab2 ON w-ek zlaczenia [WHERE ...] ...
  388. SELECT * FROM emp JOIN dept ON emp.deptno=dept.deptno;
  389. SELECT * FROM dept JOIN emp ON emp.deptno=dept.deptno;
  390. SELECT * FROM emp JOIN dept ON 1=1;
  391. SELECT * FROM emp NATURAL JOIN dept;
  392. SELECT * FROM emp NATURAL JOIN dept WHERE deptno=10;
  393. SELECT loc, COUNT(*) il_prac FROM emp JOIN dept ON emp.deptno=dept.deptno GROUP BY loc ORDER BY loc;
  394.  
  395. -- tab_1 JOIN tab2 ON w-ek-tab_1-tab2 JOIN tab_3 ON w-ek-tab_1-tab2-tab_3
  396.  
  397. CREATE TABLE salgrade AS SELECT * FROM scott.salgrade;
  398. -- I
  399. SELECT * FROM emp E JOIN dept D ON E.deptno=D.deptno JOIN salgrade S ON E.sal BETWEEN S.losal AND S.hisal;
  400. SELECT * FROM emp E, dept D, salgrade S WHERE E.deptno=D.deptno AND E.sal BETWEEN S.losal AND S.hisal;
  401. -- II
  402. SELECT * FROM emp E JOIN dept D ON E.deptno=D.deptno JOIN salgrade S ON E.sal BETWEEN S.losal AND S.hisal
  403. WHERE E.job='MANAGER';
  404. SELECT * FROM emp E, dept D, salgrade S WHERE E.deptno=D.deptno AND E.sal BETWEEN S.losal AND S.hisal AND
  405. E.job='MANAGER';
  406. -- pracownicy z Nowego Jorku
  407. SELECT * FROM emp WHERE (SELECT loc FROM dept WHERE dept.deptno=emp.deptno)='NEW YORK';
  408. SELECT * FROM emp JOIN dept ON emp.deptno=dept.deptno WHERE loc='NEW YORK';
  409. - Zlaczenia zewnętrzne (OUTER) lewostronne (LEFT), prawostronne (RIGHT), obustronne (FULL)
  410. -- tab_1 [LEFT|RIGHT|FULL] [OUTER] JOIN tab_2 ON w-ek
  411. SELECT * FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno;
  412. SELECT * FROM emp LEFT JOIN dept ON emp.deptno=dept.deptno;
  413. SELECT * FROM emp FULL JOIN dept ON emp.deptno=dept.deptno;
  414. SELECT * FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno WHERE empno IS NULL;
  415. SELECT dept.deptno, dname, loc FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno WHERE empno IS NULL;
  416.  
  417. SELECT * FROM dept D, emp E WHERE E.deptno(+)=D.deptno; -- tylko Oracle! zl. lewostronne
  418. SELECT * FROM dept D, emp E WHERE E.deptno=D.deptno(+); -- tylko Oracle! zl. prawostronne
  419.  
  420. -- SELECT ... FROM tab1 JOIN (SELECT ...) T  ON w-ek
  421.  
  422. CREATE TABLE trenerzy(
  423.     id_trenera NUMBER(4) PRIMARY KEY,
  424.     imie VARCHAR2(15),
  425.     nazwisko VARCHAR2(40)
  426. );
  427.  
  428. CREATE TABLE druzyny(
  429.     nr NUMBER(6) PRIMARY KEY,
  430.     nazwa VARCHAR2(60),
  431.     miasto VARCHAR2(30),
  432.     id_trenera NUMBER(4)
  433. );
  434.  
  435. CREATE TABLE mecze(
  436.     nr_gosp NUMBER(6),
  437.     nr_gosc NUMBER(6),
  438.     DATA DATE,
  439.     wynik_gosp NUMBER(2),
  440.     wynik_gosc NUMBER(2),
  441.    
  442.     CONSTRAINT mecze_pk PRIMARY KEY (nr_gosp, nr_gosc)
  443. );
  444. zadanie domowe:
  445.  
  446.  
  447. Tabela Drużyny zawiera dane drużyn piłkarskich. Tabela Trenerzy zawiera dane
  448. trenerów drużyn. Tabela Mecze zawiera dane wszystkich rozegranych jak dotąd
  449. meczy w bieżącym sezonie (w szczególności zawiera ona wyniki każdej z drużyn w
  450. każdym z rozegranych meczy). Zakładamy, że w sezonie żadna z drużyn nie może
  451. grać więcej niż 1 raz u tego samego gospodarza.
  452. Podaj instrukcje SQL realizujące następujące zadania:
  453. a) Utworzenie tabeli Mecze (utwórz również klucz główny)
  454. b) Wylistowanie dat i miejsc meczy, w których przegrała drużyna gospodarzy
  455. c) Wylistowanie dla każdej drużyny jej nazwy oraz liczby rozegranych przez nią meczy.
  456. Lista drużyn w porządku malejącym wg tej wielkości.
  457. d) Wyliczenie ile łącznie zostało strzelonych bramek
  458. e) Wylistowanie danych drużyn, które nie rozegrały żadnego meczu
  459. f) Wylistowanie danych drużyn, które rozegrały przynajmniej 2 mecze w sezonie
  460. g) Zmodyfikowanie tabeli Drużyny tak, aby do nazwy drużyny dołączona została przy
  461. użyciu znaku podkreślenia nazwa jej miasta.
  462. (operator konkatenacji łańcuchów: ||)
  463. h) Wylistowanie nazwiska trenera, którego drużyna nie przegrała żadnego meczu.
  464. CREATE TABLE trenerzy(
  465.     id_trenera NUMBER(4) PRIMARY KEY,
  466.     imie VARCHAR2(15),
  467.     nazwisko VARCHAR2(40)
  468. );
  469.  
  470. CREATE TABLE druzyny(
  471.     nr NUMBER(6) PRIMARY KEY,
  472.     nazwa VARCHAR2(60),
  473.     miasto VARCHAR2(30),
  474.     id_trenera NUMBER(4)
  475. );
  476.  
  477. CREATE TABLE mecze(
  478.     nr_gosp NUMBER(6),
  479.     nr_gosc NUMBER(6),
  480.     DATA DATE,
  481.     wynik_gosp NUMBER(2),
  482.     wynik_gosc NUMBER(2),
  483.    
  484.     CONSTRAINT mecze_pk PRIMARY KEY (nr_gosp, nr_gosc)
  485. );
  486.  
  487. -- Tabela Drużyny zawiera dane drużyn piłkarskich. Tabela Trenerzy zawiera dane
  488. -- trenerów drużyn. Tabela Mecze zawiera dane wszystkich rozegranych jak dotąd
  489. -- meczy w bieżącym sezonie (w szczególności zawiera ona wyniki każdej z drużyn w
  490. -- każdym z rozegranych meczy). Zakładamy, że w sezonie żadna z drużyn nie może
  491. -- grać więcej niż 1 raz u tego samego gospodarza.
  492. -- Podaj instrukcje SQL realizujące następujące zadania:
  493. -- a) Utworzenie tabeli Mecze (utwórz również klucz główny)
  494. -- b) Wylistowanie dat i miejsc meczy, w których przegrała drużyna gospodarzy
  495. SELECT DATA, miasto FROM mecze JOIN druzyny ON NR_GOSP = NR WHERE wynik_gosp < wynik_gosc;
  496. SELECT DATA, (SELECT miasto FROM druzyny WHERE nr=mecze.nr_gosp) miasto FROM mecze WHERE wynik_gosp < wynik_gosc;
  497. -- c) Wylistowanie dla każdej drużyny jej nazwy oraz liczby rozegranych przez nią meczy.
  498. -- Lista drużyn w porządku malejącym wg tej wielkości.
  499. SELECT nazwa, (SELECT COUNT(*) FROM mecze WHERE dr.nr = nr_gosp OR dr.nr = nr_gosc) AS ilosc_meczy
  500. FROM druzyny dr ORDER BY ilosc_meczy DESC;
  501. -- d) Wyliczenie ile łącznie zostało strzelonych bramek
  502. SELECT SUM(wynik_gosp)+SUM(wynik_gosc) FROM mecze;
  503. SELECT SUM(wynik_gosp+wynik_gosc) FROM mecze;
  504. -- e) Wylistowanie danych drużyn, które nie rozegrały żadnego meczu
  505. SELECT nr, nazwa, miasto, imie, nazwisko FROM druzyny JOIN trenerzy ON druzyny.id_trenera = trenerzy.id_trenera
  506. WHERE nr NOT IN (SELECT nr_gosp FROM mecze) AND nr NOT IN (SELECT nr_gosc FROM mecze);
  507.  
  508. SELECT nr, nazwa, miasto FROM druzyny
  509. WHERE nr NOT IN (SELECT nr_gosp FROM mecze) AND nr NOT IN (SELECT nr_gosc FROM mecze);
  510.  
  511. SELECT nr, nazwa, miasto FROM druzyny
  512. WHERE nr NOT IN
  513. (SELECT nr_gosp FROM mecze
  514. UNION
  515. SELECT nr_gosc FROM mecze);
  516.  
  517. -- f) Wylistowanie danych drużyn, które rozegrały przynajmniej 2 mecze w sezonie
  518. SELECT nr, nazwa, miasto, id_trenera FROM (SELECT nr, nazwa, miasto, id_trenera, (SELECT COUNT(*) FROM mecze WHERE dr.nr = nr_gosp OR dr.nr = nr_gosc) AS ilosc_meczy
  519. FROM druzyny dr) T WHERE ilosc_meczy>=2;
  520.  
  521. -- SELECT nr, nazwa, miasto, id_trenera, count(*) FROM druzyny D JOIN mecze M ON D.nr=M.nr_gosp OR D.nr=M.nr_gosc
  522. -- GROUP BY nr, nazwa, miasto, id_trenera;
  523.  
  524. SELECT nr, nazwa, miasto, id_trenera FROM druzyny D JOIN mecze M ON D.nr=M.nr_gosp OR D.nr=M.nr_gosc
  525. GROUP BY nr, nazwa, miasto, id_trenera HAVING COUNT(*)>=2;
  526. -- g) Zmodyfikowanie tabeli Drużyny tak, aby do nazwy drużyny dołączona została przy
  527. -- użyciu znaku podkreślenia nazwa jej miasta.
  528. -- (operator konkatenacji łańcuchów: ||)
  529. UPDATE druzyny SET nazwa = nazwa || miasto;
  530. -- h) Wylistowanie nazwiska trenera, którego drużyna nie przegrała żadnego meczu.
  531.  
  532. SELECT (SELECT imie FROM trenerzy WHERE id_trenera=druzyny.id_trenera), (SELECT nazwisko FROM trenerzy WHERE id_trenera=druzyny.id_trenera) FROM druzyny WHERE nr NOT IN (
  533. SELECT nr_gosp FROM mecze WHERE wynik_gosp<wynik_gosc
  534. UNION
  535. SELECT nr_gosc FROM mecze WHERE wynik_gosc<wynik_gosp);
  536.  
  537. SELECT imie, nazwisko FROM trenerzy JOIN druzyny dr ON trenerzy.id_trenera = dr.id_trenera
  538. WHERE (SELECT COUNT(*) FROM mecze WHERE (dr.nr = nr_gosp AND wynik_gosp<wynik_gosc)
  539. OR (dr.nr = nr_gosc AND wynik_gosp>wynik_gosc))=0;
  540.  
  541. SELECT imie, nazwisko FROM trenerzy JOIN druzyny dr ON trenerzy.id_trenera = dr.id_trenera WHERE nr NOT IN
  542. (SELECT nr_gosp FROM mecze WHERE wynik_gosp<wynik_gosc
  543. UNION
  544. SELECT nr_gosc FROM mecze WHERE wynik_gosc<wynik_gosp);
  545. CREATE TABLE nazwa_tabeli AS SELECT [DISTINCT] (nazwa_kolumny,...,nazwa_kolumny)
  546. FROM nazwa_tabeli;
  547. CREATE TABLE nazwa_tabeli AS SELECT * FROM nazwa_tabeli;
  548. CREATE TABLE nazwa_tabeli (
  549. nazwa_kolumny TYP [PRIMARY KEY] [NOT NULL] [UNIQUE],
  550. ...
  551. nazwa_kolumny TYP,
  552. CONSTRAINT nazwa FOREIGN KEY (nazwa_kol_lok, ..., nazwa_kol_lok) REFERENCES nazwa_tabeli_obcej
  553. [(nazwa_kolumny_obcej,..., nazwa_kolumny_obcej)] [ON DELETE CASCADE|SET NULL]
  554. );
  555.  
  556. SELECT * FROM emp;
  557.  
  558. CREATE TABLE zawody (
  559.     nr NUMBER(2),
  560.     opis VARCHAR2(30),
  561.     CONSTRAINT zawody_pk PRIMARY KEY (nr)
  562. );
  563.  
  564. CREATE TABLE dane_os2 (
  565.     nr NUMBER(2),
  566.     imie VARCHAR2(15),
  567.     nazwisko VARCHAR2(30),
  568.     nr_zawodu NUMBER(2),
  569.     CONSTRAINT dane_os_pk PRIMARY KEY (nr),
  570.     CONSTRAINT dane_os_fk FOREIGN KEY (nr_zawodu) REFERENCES zawody (nr) -- ON DELETE CASCADE
  571. );
  572. -- lub inaczej:
  573. CREATE TABLE dane_os2 (
  574.     nr NUMBER(2),
  575.     imie VARCHAR2(15),
  576.     nazwisko VARCHAR2(30),
  577.     nr_zawodu NUMBER(2) REFERENCES zawody (nr) -- ON DELETE CASCADE,
  578.     CONSTRAINT dane_os_pk PRIMARY KEY (nr)
  579. );
  580.  
  581. INSERT INTO dane_os2 VALUES (1, 'Jan', 'Kowalski', 10);
  582. INSERT INTO zawody VALUES (10, 'nauczyciel');
  583. SELECT * FROM zawody;
  584. INSERT INTO dane_os2 VALUES (1, 'Jan', 'Kowalski', 10);
  585.  
  586. DELETE FROM zawody WHERE nr=10;
  587.  
  588. DROP TABLE dane_os2;
  589.  
  590. CREATE TABLE dane_os2 (
  591.     nr NUMBER(2),
  592.     imie VARCHAR2(15),
  593.     nazwisko VARCHAR2(30),
  594.     nr_zawodu NUMBER(2),
  595.     CONSTRAINT dane_os_pk PRIMARY KEY (nr),
  596.     CONSTRAINT dane_os_fk FOREIGN KEY (nr_zawodu) REFERENCES zawody (nr) ON DELETE CASCADE
  597. );
  598.  
  599. INSERT INTO dane_os2 VALUES (1, 'Jan', 'Kowalski', 10);
  600. SELECT * FROM dane_os2;
  601. DELETE FROM zawody WHERE nr=10;
  602. SELECT * FROM zawody;
  603. SELECT * FROM dane_os2;
  604.  
  605.  
  606.  
  607. SELECT deptno, job, COUNT(*), SUM(sal) FROM emp
  608. GROUP BY (deptno, job);
  609.  
  610. -- ROLLUP
  611.  
  612. SELECT deptno, job, COUNT(*), SUM(sal) FROM emp
  613. GROUP BY ROLLUP(deptno, job);
  614.  
  615. -- CUBE
  616.  
  617. SELECT deptno, job, COUNT(*), SUM(sal) FROM emp
  618. GROUP BY CUBE (deptno, job);
  619.  
  620. SELECT * FROM emp;
  621. -- PIVOT
  622.  
  623. SELECT * FROM (SELECT empno, job FROM emp)
  624. PIVOT (COUNT(empno) FOR job IN ('SALESMAN', 'CLERK', 'PRESIDENT')
  625. );
  626.  
  627. -- bez PIVOTa
  628. SELECT job, COUNT(empno) FROM emp
  629. GROUP BY job
  630. HAVING job IN ('SALESMAN', 'CLERK', 'PRESIDENT');
  631.  
  632. SELECT * FROM (SELECT deptno, empno, job FROM emp)
  633. PIVOT (COUNT(empno) FOR job IN ('SALESMAN', 'CLERK', 'PRESIDENT')
  634. );
  635.  
  636. SELECT * FROM (SELECT job, sal FROM emp )
  637. PIVOT (SUM(sal) AS suma
  638. FOR job IN ('MANAGER' pensja_managerow, 'ANALYST' pensja_analitykow));
  639.  
  640. SELECT * FROM (SELECT deptno, job, sal FROM emp )
  641. PIVOT (SUM(sal) AS suma
  642. FOR job IN ('MANAGER' pensja_managerow, 'ANALYST' pensja_analitykow));
  643.  
  644.  
  645. SELECT * FROM (SELECT job, deptno, sal FROM emp )
  646. PIVOT (SUM(sal) AS suma
  647. FOR (job, deptno) IN (('MANAGER', 10) pensja_managerow_10, ('MANAGER', 20) pensja_managerow_20));
  648. -- WITH ...
  649. SELECT rok_zatr, SUM(sal) FROM (SELECT empno, ename, sal, TO_CHAR(hiredate, 'YYYY') rok_zatr FROM emp) emp_n
  650. GROUP BY rok_zatr ORDER BY rok_zatr;
  651.  
  652. WITH emp_n AS (SELECT empno, ename, sal, TO_CHAR(hiredate, 'YYYY') rok_zatr FROM emp)
  653. SELECT rok_zatr, SUM(sal) FROM emp_n
  654. GROUP BY rok_zatr ORDER BY rok_zatr;
  655.  
  656. SELECT deptno, SUM(sal) suma, round(avg(sal),2) srednia, MIN(sal) minimum, MAX(sal) maksimum FROM emp
  657. GROUP BY deptno;
  658.  
  659. SELECT ename, sal, srednia FROM emp E JOIN (SELECT deptno, SUM(sal) suma, round(avg(sal),2) srednia, MIN(sal) minimum, MAX(sal) maksimum FROM emp
  660. GROUP BY deptno) S ON E.deptno=S.deptno;
  661.  
  662. WITH statystyki AS (SELECT deptno, SUM(sal) suma, round(avg(sal),2) srednia, MIN(sal) minimum, MAX(sal) maksimum FROM emp
  663. GROUP BY deptno)
  664. SELECT ename, sal, srednia FROM emp E JOIN statystyki S ON E.deptno=S.deptno;
  665.  
  666. SELECT nr, nazwa, miasto, id_trenera FROM (SELECT nr, nazwa, miasto, id_trenera, (SELECT COUNT(*) FROM mecze WHERE dr.nr = nr_gosp OR dr.nr = nr_gosc) AS ilosc_meczy
  667. FROM druzyny dr) T WHERE ilosc_meczy>=2;
  668.  
  669. WITH T AS
  670. (SELECT nr, nazwa, miasto, id_trenera, (SELECT COUNT(*) FROM mecze WHERE dr.nr = nr_gosp OR dr.nr = nr_gosc) AS ilosc_meczy
  671. FROM druzyny dr)
  672. SELECT nr, nazwa, miasto, id_trenera FROM T
  673. WHERE ilosc_meczy>=2;
  674.  
  675. -- rekurencja
  676.  
  677. SELECT * FROM emp
  678. START WITH mgr IS NULL
  679. CONNECT BY PRIOR empno = mgr;
  680.  
  681. SELECT * FROM emp
  682. START WITH empno=7934
  683. CONNECT BY empno = prior mgr;
  684.  
  685. WITH
  686.   rek(empno, mgr, ename) AS (
  687.     SELECT  empno, mgr, ename
  688.       FROM  emp
  689.       WHERE empno = 7934
  690.     UNION ALL
  691.     SELECT  e.empno, e.mgr, e.ename
  692.       FROM  emp e JOIN rek ON e.empno = rek.mgr
  693.   )
  694. SELECT *
  695. FROM   rek;
  696. -- WHERE  mgr IS NULL;
  697. -- zagadnienia przykładowego zadania kolokwium
  698. -- HOTEL:
  699. -- pokoje (nr_pok, ile_osob, rodzaj)
  700. -- goscie (nr_rezerwacji, nr_pok, pesel, imie, nazwisko)
  701. -- rezerwacja (nr_rezerwacji, nr_pok, od, do)
  702. -- ceny (rodzaj, cena_podst, cena_wakacyjna)
  703. -- Polecenia:
  704. -- 1)   Z tabeli Goscie znajdź te osoby, których nazwisko zaczyna się literami ‘No’. Wyświetl ich pesele oraz połączenie napisów: nazwisko pisane wielkimi literami ‘ ‘(spacja) imie.
  705. -- 2)   Wyświetl numery pokoi i ich pojemność dla tego rodzaju, którego cena_wakacyjna jest najwyższa
  706. -- 3)   Dla każdego pokoju wyświetl jego numer, cenę podstawową dla jego rodzaju, oraz nazwiska gości do tego pokoju przypisanych. Jeżeli pokój nie jest przypisany do żadnego gościa, nadal ma się pojawić na liście, a w miejscu na nazwisko ma pojawić się null
  707. -- 4)   Dla wszystkich rezerwacji z datą ‘od’ po 1.06.2020 policz jednym zapytaniem ilość różnych peseli dla następujących 3 poziomów grupowań: każdej nr_rezerwacji i nr_pokoju; dla każdego nr_rezerwacji; łączną ilość różnych peseli
  708. -- 5)   Znajdź te numery rezerwacji, dla których jest podany jest numer pokoju, ale w tabeli gości nie ma pasującego wpisu (porównaj nr_rezerwacji oraz nr_pokoju)
  709. -- 6)   Wyświetl ile jest rodzajów pokojów, dla których cena_wakacyjna jest niewypełniona
  710. -- 7)   Dla każdego pokoju 4 osobowego wyświetl jego rodzaj i ilość różnych wpisów w kolumnie ile_osob dla wszystkich pokojów o tym samym rodzaju